Overview:我正在使用Swing(Java)制作一个国际象棋游戏,在制作棋盘格图案时,我遇到了一个问题,即我用drawRect创建的矩形在窗口启动后不久就消失了.

当我创建的矩形不在for循环中时,这个问题不会发生,尽管我不确定为什么.

public class Main extends JPanel {
    
    private static JFrame frame;
    private static Container contentPanel;
    private int rectX = 0;
    private int rectY = 0;
    
    // draw game textures
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        // draw chess board
        for (int i = 1; i <= 64; i++) {
            
            // light square
            if (i % 2 != 0) {
                g.drawRect(rectX, rectY, 100, 100);
                rectX += 100;
            }
            // dark square
            else {
                g.fillRect(rectX, rectY, 100, 100);
                rectX += 100;
            }
            
            // check if the row has ended
            if (i % 8 == 0 && i != 0) {
                rectX = 0;
                rectY += 100;
            }
        }
    }
    
    // define preferred size
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 800);
    }
    
    // create GUI
    private static void createAndShowGui() {
        Main main = new Main();
        
        frame = new JFrame("Java Chess V1.0");
        contentPanel = frame.getContentPane();
        contentPanel.add(main);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

我试着制作单独的矩形,而不是使用for循环,这是可行的,但如果可能的话,我宁愿不要64行g.drawRect(...).

推荐答案

利用100来创建图案.

public class Main extends JPanel {

    private static JFrame frame;
    private static Container contentPanel;

    Main() {
        draw();
    }

    // draw game textures
    private void draw() {
        setLayout(new GridLayout(8, 8));
        double w = getPreferredSize().getWidth(),
               h = getPreferredSize().getHeight();
        Dimension d = new Dimension((int) (w / 8), (int) (h / 8));
        Color cb = Color.black, cw = Color.white;
        boolean b = true;
        JLabel label;
        for (int i = 0; i < 8 * 8; i++) {
            label = new JLabel();
            label.setPreferredSize(d);
            b = i % 8 == 0 == b;
            label.setBackground(b ? cb : cw);
            label.setOpaque(true);
            add(label);
        }
    }

    // define preferred size
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 800);
    }

    // create GUI
    private static void createAndShowGui() {
        Main main = new Main();

        frame = new JFrame("Java Chess V1.0");
        contentPanel = frame.getContentPane();
        contentPanel.add(main);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

下面是关于GridLayoutJava教程.

  • 100.

Java相关问答推荐

PostgreSQL货币兑换率查询

我可以在regex中的字符类中放置断言吗?

RxJava PublishSubject缓冲区元素超时

为什么Java的代码工作(if condition内部的实例)

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

是否保证在事务性块的末尾标记违反约束?

Spring和可编辑";where";@Query

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

使用PDFBox从PDF中删除图像

使用存储在字符串变量中的路径目录打开.pdf文件

如何使用路径过渡方法使 node 绕圆旋转?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

将ByteBuffer异步写入InputStream或Channel或类似对象

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

如何从命令行编译包中的所有类?

Java CDI:@Singleton@Startup@Inject无法实现接口

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

java 11上出现DateTimeParseException,但java 8上没有

java中的网上购物车解析错误