所以,我开始用Java和Java设计TicTacToe 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)我得到的第一个问题是,无论何时我编译&amp;运行此命令,JFrame上不会显示任何组件。但是,如果我最大化框架,所有组件都会出现。那是什么?
2)如果我取消注释lay1,lay2&amp;在JPanels声明中使用JPanel(布局)构造函数的lay3,我得到BoxLayout can't be shared
错误(运行时)&amp;框架上没有任何内容。在这种情况下,即使最大化也无济于事。
我做错了什么?你有更好的方法来创建GUI吗?
答案 0 :(得分:3)
对于您的第一个问题,请在添加框架内的所有组件后设置可见性状态(frameX.setVisible(true);
)。换句话说,将此行放在go
方法的末尾。
您的问题是显示JFrame
,然后更改其内容。因此必须刷新框架以显示其新内容。如果您在添加内容后将可见性状态设置为true
,则不会出现此问题。
关于你的第二个问题,我从不使用BoxLayout
,但也许你可以看看this page解释如何使用它。否则,您可以考虑使用其他布局吗?
答案 1 :(得分:0)
BoxLayout会导致这些类型的问题。你必须这样做:
panel1 = new JPanel();
panel1.setLayout(lay1);
所以问题源于你做事的顺序。
当你这样做时:
LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS);
panel1尚未初始化,因此它为null。不幸的是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);