【问题标题】:Some Problems designing the GUI设计GUI的一些问题
【发布时间】:2010-11-02 17:32:47
【问题描述】:

所以,我开始用 Java 设计井字游戏 GUI,但我陷入了困境。

这是我正在处理的代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class gameWindow {
int b;
JFrame frameX;
JPanel panel1, panel2, panel3, panel4;
JLabel[] labelX = new JLabel[10];
JTextField inputter;
JButton input;
JButton exit;
public static void main(String[] args) {
    gameWindow xyz = new gameWindow();
    xyz.go();
}

public void go() {
    frameX = new JFrame();
    //frameX.setResizable(false);
    LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS);
    LayoutManager lay2 = new BoxLayout(panel2, BoxLayout.X_AXIS);
    LayoutManager lay3 = new BoxLayout(panel3, BoxLayout.X_AXIS);
    panel1 = new JPanel(/*lay1*/);
    panel2 = new JPanel(/*lay2*/);
    panel3 = new JPanel(/*lay3*/);
    panel4 = new JPanel();
    //
    for (b=1; b<10; b++) {
        labelX[b] = new JLabel();
    }
    //
    inputter = new JTextField();
    input = new JButton();
    exit = new JButton();
    frameX.setSize(300,300);
    frameX.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frameX.setVisible(true);
    //
    for(b=1; b<10; b++) {
        labelX[b].setForeground(Color.BLUE);
        labelX[b].setPreferredSize(new Dimension(50,50));
        labelX[b].setText("X");
        if (b<4) {
            panel1.add(labelX[b]);
        } else if(b>3 && b<7) {
            panel2.add(labelX[b]);
        } else if(b>6) {
            panel3.add(labelX[b]);
        }
    }
    //
    inputter.setPreferredSize(new Dimension(50,50));
    inputter.setText("Enter box number here");
    input.setPreferredSize(new Dimension(50,50));
    input.setText("Play");
    exit.setPreferredSize(new Dimension(50,50));
    exit.setText("Exit");
    exit.addActionListener(new forExit());
    panel4.add(inputter);
    panel4.add(input);
    panel4.add(exit);
    //Adding Panels to the frame
    frameX.getContentPane().add(BorderLayout.NORTH, panel1);
    frameX.getContentPane().add(BorderLayout.CENTER, panel2);
    frameX.getContentPane().add(BorderLayout.SOUTH, panel3);
    frameX.getContentPane().add(BorderLayout.EAST, panel4);
}

class forExit implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
   }
 }

1) 我遇到的第一个问题是,每当我编译和运行它时,JFrame 上都没有显示任何组件。但是,如果我最大化框架,所有组件都会出现。那是什么?

2) 如果我取消注释 JPanel 声明中的lay1、lay2 和lay3 以使用JPanel 的(布局)构造函数,我会得到BoxLayout can't be shared 错误(运行时)并且框架上不会出现任何内容。在这种情况下,即使最大化也无济于事。

我做错了什么&你有更好的方法来创建 GUI?

【问题讨论】:

    标签: java user-interface swing


    【解决方案1】:

    对于您的第一个问题,设置可见性状态 (frameX.setVisible(true);)添加框架内的所有组件之后。换句话说,将这一行放在go 方法的末尾。

    您的问题是显示JFrame,然后您更改他的内容。所以必须刷新框架才能显示他的新内容。如果添加内容后设置可见状态为true,就不会出现这个问题了。

    关于你的第二个问题,我从不使用BoxLayout,但也许你可以看看this page,它解释了如何使用它。否则,也许您可​​以考虑使用其他布局?

    【讨论】:

    • 另一个问题是,一旦你 setVisible 你绝对不允许在你正在使用的线程中修改你的框架的内容。从技术上讲,即使对于您正在做的事情,您也应该在对框架执行任何操作之前使用 invokeLater 或其他东西进入 AWT 线程,但我从未见过代码失败,只要您在实现后不对其进行修改(之后setVisible(true)),但是 Sun 表示可能会失败,并且所有 swing 更新都必须在 awt 线程上。
    • 知道了。谢谢,你们俩。但是,BoxLayout 出了什么问题?
    【解决方案2】:

    BoxLayout 确实会导致这些类型的问题。你必须这样做:

     panel1 = new JPanel();
     panel1.setLayout(lay1);
    

    所以问题出在你做事的顺序上。

    当你这样做时:

      LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS);
    

    panel1 尚未初始化,因此为空。不幸的是 BoxLayout 会抱怨这个。要解决您需要的问题:

    panel1 = new JPanel();
    panel2 = new JPanel();
    panel3 = new JPanel();
    
    LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS);
    LayoutManager lay2 = new BoxLayout(panel2, BoxLayout.X_AXIS);
    LayoutManager lay3 = new BoxLayout(panel3, BoxLayout.X_AXIS);
    
    panel1.setLayout(lay1);
    panel2.setLayout(lay2);
    panel3.setLayout(lay3);
    

    【讨论】:

    • 好的。请参阅我上面的编辑。这样就解决了问题,程序现在可以运行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多