Java Swing JPanel未显示

时间:2015-10-11 20:04:56

标签: java swing user-interface

我目前在为作业设计GUI时遇到问题。虽然项目目前在程序开始时有一段时间我希望它显示用户必须等待一个玩家,所以我希望gamePanel一开始不可见waitingForPlayerPanel 1}}显示“等待其他玩家”。

不幸的是,由于某种原因waitingForPlayerPanel尽管设置为hideGamePanel中可见,但仍未显示public class ClientGame extends JFrame implements ActionListener, Runnable { private Socket server = null; private BufferedReader in = null; private PrintWriter out = null; private static final Color[] playerColours = { Color.GREEN, Color.RED }; private JButton[][] myButtons = new JButton[3][3]; private JLabel waitingForPlayer = new JLabel("Waiting for other player"); private JPanel waitingForPlayerPanel = new JPanel(); private JPanel gamePanel = new JPanel(); ClientGame() { try { this.server = new Socket("127.0.0.1", 4444); this.in = new BufferedReader(new InputStreamReader(this.server.getInputStream())); this.out = new PrintWriter(this.server.getOutputStream(), true); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Alert", "Couldn't connect to the server.", JOptionPane.ERROR_MESSAGE); System.exit(-1); } } public void initUI() { this.waitingForPlayerPanel.setLayout(new BorderLayout()); this.waitingForPlayerPanel.setBackground(Color.white); this.waitingForPlayerPanel.add("Center", this.waitingForPlayer); this.getContentPane().add(this.waitingForPlayerPanel); this.gamePanel.setLayout(new GridLayout(3,3)); this.gamePanel.setSize(450,450); this.gamePanel.setBackground(Color.white); this.getContentPane().add(this.gamePanel); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { this.myButtons[i][j] = new JButton(); this.myButtons[i][j].setPreferredSize(new Dimension(150, 150)); this.myButtons[i][j].addActionListener(this); this.gamePanel.add(this.myButtons[i][j]); } } this.hideGamePanel(); this.setVisible(true); WindowListener l = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }; this.addWindowListener(l); } private void hideGamePanel() { this.gamePanel.setVisible(false); this.waitingForPlayerPanel.setVisible(true); this.pack(); } private void showGamePanel() { this.gamePanel.setVisible(true); this.waitingForPlayerPanel.setVisible(false); this.pack(); } // ... } 。我目前正在Ubuntu 14.04上做这个项目,如果这有帮助。

以下是我编写的代码片段。

BLOCK_SIZE_X x BLOCK_SIZE_Y

1 个答案:

答案 0 :(得分:1)

使用CardLayout

解决了问题
public class ClientGame extends JFrame implements ActionListener, Runnable {  
    private Socket server = null;
    private BufferedReader in = null;
    private PrintWriter out = null;

    // IDs for CardLayout
    private static final String WAITING_PANEL_ID = "waiting";
    private static final String GAME_PANEL_ID = "game";

    private JButton[][] myButtons = new JButton[3][3];
    private JLabel waitingForPlayer = new JLabel("Waiting for other player");
    private JPanel cardPanel = new JPanel();
    private JPanel waitingForPlayerPanel = new JPanel();
    private JPanel gamePanel = new JPanel();
    private int squares = 9;

    protected boolean isTurn = false;

    ClientGame() {
        try {
            this.server = new Socket("127.0.0.1", 4444);
            this.in = new BufferedReader(new InputStreamReader(this.server.getInputStream()));
            this.out = new PrintWriter(this.server.getOutputStream(), true);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Alert", 
                    "Couldn't connect to the server.", JOptionPane.ERROR_MESSAGE);
            System.exit(-1);
        }
    }

    public void initUI() {
        this.cardPanel.setLayout(new CardLayout());

        this.waitingForPlayerPanel.setLayout(new BorderLayout());
        this.waitingForPlayerPanel.setBackground(Color.white);
        this.waitingForPlayerPanel.add(BorderLayout.CENTER, this.waitingForPlayer);
        this.cardPanel.add(this.waitingForPlayerPanel, WAITING_PANEL_ID);

        this.gamePanel.setLayout(new GridLayout(3,3));
        this.gamePanel.setSize(450,450);
        this.gamePanel.setBackground(Color.white);
        this.cardPanel.add(this.gamePanel, GAME_PANEL_ID);
        for(int i=0;i<3;i++) {
            for(int j=0;j<3;j++) {
                this.myButtons[i][j] = new JButton();
                this.myButtons[i][j].setPreferredSize(new Dimension(150, 150));
                this.myButtons[i][j].addActionListener(this);
                this.gamePanel.add(this.myButtons[i][j]);
            }
        }

        this.getContentPane().add(this.cardPanel);

        this.hideGamePanel();

        this.setVisible(true);

        WindowListener l = new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };

        this.addWindowListener(l);
    }

    // changes made here
    private void hideGamePanel() {
        CardLayout cl = (CardLayout)this.cardPanel.getLayout();
        cl.show(this.cardPanel, WAITING_PANEL_ID);
        this.pack();
    }

    // changes made here
    private void showGamePanel() {
        CardLayout cl = (CardLayout)this.cardPanel.getLayout();
        cl.show(this.cardPanel, GAME_PANEL_ID);
        this.pack();
    }
}