繁体   English   中英

java GUI 多个按钮 output 显示错误?

[英]java GUI multiple buttons output display error?

我是 Java 的初学者。 这是我的第一个项目。 每次运行代码时,代码的 GUI 都会不断变化。 有时 output 甚至没有完全加载。 这是用于初始化棋盘 8X8 jbuttons 的代码。

我已经放下了图片,请查看下面的超链接。

是否有任何解决方案每次执行代码时都显示相同的 output?

    package chess;
    import game.*;
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.util.*;

    public class board{
    static JButton [][] spots =new  JButton [8][8];
    public static void main(String[] args){
    board b =new board();
    b.initializeboard(spots);
    }


    public void initializeboard(JButton [][] spots){
    JFrame f = new JFrame("CHESS");
    f.setVisible(true);
    f.setSize(800,800);

    GridLayout layout =new GridLayout(8,8,1,1); 
    f.setLayout(layout);

    for(int ver=0;ver<8;ver++){
      for(int hor=0;hor<8;hor++){
           JButton button = new JButton();
           if((ver+hor)%2==0){
                    button.setBackground(Color.WHITE); }
           else{
                    button.setBackground(new Color(255,205,51)); }
           pieces p =new pieces();
           spots[ver][hor] = button;
           p.setButton(button);
           f.add(button);
           }
              }
                  } //initialize board
                       }  // close board

执行不当

正确执行

执行不完整

我是 Java 的初学者。

首先,class 名称应该以大写字符开头。 你有没有在 JDK 中看到一个不以大写字符开头的 class? 从教科书或教程中的代码示例中学习。

是否有任何解决方案每次执行代码时都显示相同的 output?

在使框架可见之前,应将所有组件添加到框架中。

当框架可见时,将调用布局管理器并为组件指定大小/位置。 如果将组件添加到可见面板,则需要在面板上调用revalidate()repaint()以确保调用布局管理器。

必须承认我不确定你为什么会得到这种随机行为。 一些组件正在获取大小/位置,而其他组件即使没有调用布局管理器也没有。

我建议你重组你的代码,比如:

JPanel chessboard = new JPanel( new GridLayout(8, 8,  1, 1) );
// add buttons to the panel

JFrame frame = new JFrame("CHESS")
frame.add(chessboard, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );

其他的建议:

  1. 不要设置框架的大小。 使用 800 x 800 不会使每个按钮成为 100 x 100。框架大小还包括标题栏和边框,因此每个按钮的大小都会小于您的预期。

相反,您可以在循环之外创建一个变量:

Dimension buttonSize = new Dimension(100, 100)

然后,当您创建您使用的按钮时:

button.setPreferredSize( buttonSize );

现在,当调用 pack() 方法时,会将框架调整为添加到框架中的所有组件的首选大小。

  1. 所有 Swing 组件都应在Event Dispatch Thread (EDT)上创建。 阅读 Swing 教程如何制作框架中的部分。 FrameDemo.java代码向您展示了一种构建 class 的方法,以便使用invokeLater(…)方法确保代码在 EDT 上执行。

  2. 不要让你的变量 static。 这表明 class 设计不正确。 查看如何使用菜单中的MenuLook.java示例,了解稍微不同的设计,您的ChessBoard成为在另一个 class 中创建的组件。 然后,您可以在该 class 中定义您的实例变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM