2010-11-02 31 views
2

因此,我已经开始在Java中设计一个TicTacToe GUI &我卡住了。设计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)如果我取消了lay1,lay2在JPanels声明使用JPanel的(布局)构造& LAY3,我得到的BoxLayout can't be shared错误时(runtime)&没有出现在框架上。在这种情况下,即使最大化也无济于事。

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

回答

3

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

您的问题是显示JFrame,之后,您更改其内容。因此,框架必须刷新以显示其新内容。如果在添加内容后将可见性状态设置为true,则不会出现此问题。

关于你的第二个问题,我从来没有使用BoxLayout,但也许你可以看看this page,它解释了如何使用它。否则,也许你可以考虑使用另一种布局?

+2

另一个问题是,一旦你setVisible你绝对不允许修改你正在使用的线程中的帧的内容。从技术上讲,即使你在做什么,你应该在使用框架之前使用invokeLater或其他东西来获得AWT线程,但是我从来没有看到代码失败,只要你没有在实现后修改它(在setVisible(true)),但是Sun说失败是可能的,并且所有的摆动更新必须位于awt线程上。 – 2010-11-02 17:45:22

+0

明白了。谢谢,你们俩。 但是,BoxLayout仍然存在什么问题? – MoonStruckHorrors 2010-11-02 17:54:34

0

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); 
+0

不,先生,没有帮助。 :( – MoonStruckHorrors 2010-11-02 18:13:30

+0

好的,看到我上面的编辑,解决了这个问题,程序现在运行。 – 2010-11-03 17:35:45