我将如何制作这款可调整大小的Chess GUI?
我们公司的任务是制作国际象棋游戏.它需要在Windows,OS X和Linux/Unix机器上工作,我们选择Java来实现这一点,同时保持一个通用的代码库(便于维护和降低成本).
我的任务是创建GUI.用户设计团队已经清除了以下规范.与客户.
国际象棋比赛(国际象棋冠军)将有力量调整大小和直接,它包括:
- 顶部的工具栏,带有UI组件:
- New 按键
- Save 按键
- Restore 按键
- Resign 按键
- 用于向玩家提供消息的标签.
在游戏的左侧,我们需要一个保留供将来使用的区域,它可能包括以下内容:
- 捕获的碎片列表
- 促销典当时选择件的选择器
- 游戏统计
- 提示等
客户和逻辑团队仍在解决这方面的细节.因此,暂时只需使用包含
?文本的标签进行标记即可.GUI的其余部分将由棋盘本身组成.它将有:
- 国际象棋棋盘的主要区域.如果用户指向棋子,它应该显示带边框的焦点.它也应该是键盘可访问的.客户将提供多个棋子(各种尺寸,样式和颜色)的精灵表,以允许用户改变游戏的外观.
- 棋盘将有标签指示列(从左到右:A,B,C,D,E,F,G和H)和行(从上到下:8,7,6,5,4,3,2) &1).
- 国际象棋棋盘和列/行标签将以1px黑色边框为边界,周围有8px填充.
- 随着玩家增加游戏的大小,棋盘应保持正方形,否则填充可用空间.
- 国际象棋棋盘后面的背景颜色应该是赭色,但在下面的模型中,我们将棋盘背后的区域设为绿色,以突出调整大小的行为.




我试图通过简单地添加鼠标监听器和使用setLocation函数来使任何组件可拖动java.awt.Component.我开始JButton测试是否有可能按照我的想法.
这是我想要做的代码示例:
import java.awt.*;
import javax.swing.*;
public class DragButton extends JButton{
private volatile int draggedAtX, draggedAtY;
public DragButton(String text){
super(text);
setDoubleBuffered(false);
setMargin(new Insets(0, 0, 0, 0));
setSize(25, 25);
setPreferredSize(new Dimension(25, 25));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
draggedAtX = e.getX() - getLocation().x;
draggedAtY = e.getY() - getLocation().y;
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
setLocation(e.getX() - draggedAtX, e.getY() - draggedAtY);
}
});
}
public static void main(String[] args){
JFrame frame = new JFrame("DragButton"); …Run Code Online (Sandbox Code Playgroud) 如何在Swing中的标签中"填充"Unicode字符?

我正在尝试为我最近编程的国际象棋程序制作一个用户界面(国际象棋棋子就像上面所见).在其中我使用unicode字符来表示我的棋子(\u2654通过\u265F).
问题如下:
当我将我的棋子背景设置为JLabel白色时,整个标签都被填满(在我的情况下,它是一个50*50px的白色正方形,顶部是角色).这导致我的作品看起来像瓷砖而不仅仅是他们的照片.
当我将标签设置为不透明时,我只得到我的棋子的饼干版本,而不是填充内部的那个.例如

有没有办法只填充角色?
如果不是,我想我会制作精灵表,但我喜欢这个,因为我可以使用国际象棋棋子toString()的标签方法.
import java.awt.*;
import javax.swing.*;
import java.util.Random;
class ChessBoard {
static Font font = new Font("Sans-Serif", Font.PLAIN, 50);
static Random rnd = new Random();
public static void addUnicodeCharToContainer(
String s, Container c, boolean randomColor) {
JLabel l = new JLabel(s);
l.setFont(font);
if (randomColor) {
int r = rnd.nextInt(255);
int g = rnd.nextInt(255);
int b = rnd.nextInt(255);
l.setForeground(new Color(r,g,b));
l.setBackground(new Color(255-r,255-g,255-b));
l.setOpaque(true);
}
c.add(l);
}
public …Run Code Online (Sandbox Code Playgroud) 我在尝试使用JLayeredPane.
我走了这么远:

(希望你能看到方块G6在标签上有一个绿色边框,显示哪个方块被选中)
但是当我将我的 2 SidePanels添加到我的ChessBoard面板,然后在顶部有另一层标签应该完全覆盖每个板块但它没有:

如您所见,围绕块的绿色边框G2已关闭。
当我将SidePanels添加到sChessBoard并将其添加到底层并将其大小设置为 600x600时,我已将其缩小到明显的范围,然后添加顶层,它是将完全适合块的标签ChessBoard,以及绿色边框围绕选定的JLabel(以及下方的ChessBoard方块 [黑色或白色])绘制,由于SidePanels 减少了棋盘的实际大小为 600x600,因此它偏离中心绘制,现在它将是600-sp1.getWidth()x 600-sp2.getHeight()。我尝试设置顶层的边界和首选大小来补偿它,但似乎没有用。任何帮助表示赞赏谢谢:
ChessBoardTest.java:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.border.BevelBorder;
public class ChessBoardTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Dimension boardSize = new Dimension(600, 600);
JFrame frame = new …Run Code Online (Sandbox Code Playgroud) 注意:这个问题看起来有点像我几周前发布的另一个问题.那时我没有把按钮添加为数组,这就是为什么这次对我来说更难.
我正在与一个国际象棋游戏合作,我已经能够自己设置一个64个方格的棋盘.然而,对于我来说,管理为正方形添加颜色似乎有点太复杂了.
我的代码看起来像这样:
Chess.java
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Chess implements config {
public static void main(String[] args) {
int[] squareArray;
squareArray = new int[65];
int i = 1;
JFrame frame = new JFrame("Chessboard");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(ROWS, COLS, 2, 2));
for (i = 1; i < 65; i++) {
squareArray[i] = i;
frame.add(new JButton("" + squareArray[i]));
}
frame.setSize(800, 800);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
Piece.java
import java.awt.Color;
import javax.swing.JFrame;
public class Piece extends JFrame implements config {
public Piece …Run Code Online (Sandbox Code Playgroud) 我正在尝试在一个框架中添加 2 个不同的面板。一个面板在框架中添加了几个按钮。其他框架会在框架中添加一个棋盘。我很困惑,如何在面板上绘制这个板。我的框架顶部有一块板,底部有按钮。此外,如果我在给定代码中出现错误,请告诉我有人可以帮助我吗?我的代码是
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
private JFrame main;
private JPanel board;
private JPanel buttons;
private JButton add;
private JButton delete;
public Test()
{
main=new JFrame();
board=new JPanel();
buttons=new JPanel();
add=new JButton("Add");
delete=new JButton("Delete");
init();
addButtons();
}
public void init()
{
main.setSize(700,700);
main.setVisible(true);
main.setDefaultCloseOperation(main.EXIT_ON_CLOSE);
}
public void addButtons()
{
buttons.setSize(700,40);
buttons.setLayout(new FlowLayout());
buttons.add(add);
buttons.add(delete);
main.add(buttons,BorderLayout.SOUTH);
}
public void addBoxes()
{
// …Run Code Online (Sandbox Code Playgroud) java ×6
swing ×6
awt ×1
background ×1
character ×1
chess ×1
eclipse ×1
grid-layout ×1
java-7 ×1
jframe ×1
jlayer ×1
jlayeredpane ×1
jpanel ×1
unicode ×1