相关疑难解决方法(0)

制作一个强大,可调整大小的Swing Chess GUI

我将如何制作这款可调整大小的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填充.
  • 随着玩家增加游戏的大小,棋盘应保持正方形,否则填充可用空间.
  • 国际象棋棋盘后面的背景颜色应该是赭色,但在下面的模型中,我们将棋盘背后的区域设为绿色,以突出调整大小的行为.

在游戏开始之前,最小尺寸的国际象棋冠军

在游戏开始之前,ChessChamp以最小尺寸

激活新游戏按钮后,最小尺寸的国际象棋冠军

激活新游戏按钮后,最小尺寸的国际象棋冠军

国际象棋冠军比最小尺寸更宽

ChessChamp比最小尺寸拉伸得更宽

国际象棋冠军比最小尺寸高

国际象棋冠军比最小尺寸高

java user-interface swing layout-manager

25
推荐指数
2
解决办法
3万
查看次数

java用鼠标移动组件

我试图通过简单地添加鼠标监听器和使用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)

java swing drag-and-drop awt mouselistener

14
推荐指数
2
解决办法
2万
查看次数

'填充'标签中的Unicode字符

如何在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)

java unicode swing background character

11
推荐指数
1
解决办法
6829
查看次数

调整 JLayeredPane 图层的大小

我在尝试使用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)

java swing jlayeredpane jlayer java-7

3
推荐指数
1
解决办法
2174
查看次数

更改GridLayout元素的颜色

注意:这个问题看起来有点像我几周前发布的另一个问题.那时我没有把按钮添加为数组,这就是为什么这次对我来说更难.

我正在与一个国际象棋游戏合作,我已经能够自己设置一个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)

java swing chess jframe grid-layout

2
推荐指数
1
解决办法
8808
查看次数

如何在Jpanel上绘画?

我正在尝试在一个框架中添加 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 eclipse swing jpanel paintcomponent

2
推荐指数
1
解决办法
2万
查看次数