【问题标题】:Error When Arranging Multiple Panels in JFrame在 JFrame 中排列多个面板时出错
【发布时间】:2014-09-29 01:22:35
【问题描述】:

我正在制作一个纸牌游戏应用程序,只是为了好玩,而我在夏天很无聊。我对 JFrames 很陌生,所以我决定查看其他代码并将其编辑为我想要的样子。在查看此网址上的答案后:How to arrange multiple panels in JFrame,我尝试将其复制到我的需要。问题是,当我运行程序时,除了基本 JFrame 的标题之外什么都没有显示,但没有任何功能(例如选择查看玩家手牌)。我似乎找不到没有显示任何功能的原因。

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

public class PlayGame extends JFrame {

    private static void createAndShowUI(){
        HandGui gui = new HandGui();
        HandMenu menu = new HandMenu(gui);
        JFrame frame = new JFrame("Hands of Players");
        frame.getContentPane().add(gui.getMainPanel());
        frame.setJMenuBar(menu.getJMenuBar());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run(){
                createAndShowUI();
            }
        });
    }

    private PlayGame(){

    }
}
class HandGui {
    private static final String[][] PLAYER1_BIN_TEXTS = {
        {"Card 1", "Card 2", "Card 3" , "Card 4"}, {"Card 5", "Card 6", "Card 7", "Card 8"},
        {"Card 9", "Card 10", "Card 11" , "Card 12"}, {"Card 13"}};
    private static final String[][] PLAYER2_BIN_TEXTS  = {
        {"Card 1", "Card 2", "Card 3" , "Card 4"}, {"Card 5", "Card 6", "Card 7", "Card 8"},
        {"Card 9", "Card 10", "Card 11" , "Card 12"}, {"Card 13"}}; 
    private static final String[][] PLAYER3_BIN_TEXTS  = {
        {"Card 1", "Card 2", "Card 3" , "Card 4"}, {"Card 5", "Card 6", "Card 7", "Card 8"},
        {"Card 9", "Card 10", "Card 11" , "Card 12"}, {"Card 13"}}; 
    private static final String[][] PLAYER4_BIN_TEXTS  = {
        {"Card 1", "Card 2", "Card 3" , "Card 4"}, {"Card 5", "Card 6", "Card 7", "Card 8"},
        {"Card 9", "Card 10", "Card 11" , "Card 12"}, {"Card 13"}};

    private static final int GAP = 5;//
    private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20);

    private JPanel mainPanel = new JPanel();
    private JPanel p1Panel;
    private JPanel p2Panel;
    private JPanel p3Panel;
    private JPanel p4Panel;

    private JTextField display = new JTextField();//May not need

    HandGui() {
        display.setFont(BTN_FONT);
        p1Panel = createBtnPanel(PLAYER1_BIN_TEXTS, "Player 1 Hand");
        p2Panel = createBtnPanel(PLAYER2_BIN_TEXTS, "Player 2 Hand");
        p3Panel = createBtnPanel(PLAYER3_BIN_TEXTS, "Player 3 Hand");
        p4Panel = createBtnPanel(PLAYER4_BIN_TEXTS, "Player 4 Hand");

        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        mainPanel.add(p1Panel, BorderLayout.CENTER);
        mainPanel.add(p2Panel, BorderLayout.CENTER);
        mainPanel.add(p3Panel, BorderLayout.CENTER);
        mainPanel.add(p4Panel, BorderLayout.CENTER);
        p1Panel.setVisible(true);
        p2Panel.setVisible(false);
        p3Panel.setVisible(false);
        p4Panel.setVisible(false);
    }

    public void p1PanelSetVisable(boolean visable) {
        p1Panel.setVisible(true);
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.pack();
    }

    public void p2PanelSetVisable(boolean visable) {
        p2Panel.setVisible(true);
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.pack();
    }

    public void p3PanelSetVisable(boolean visable) {
        p3Panel.setVisible(true);
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.pack();
    }

    public void p4PanelSetVisable(boolean visable) {
        p4Panel.setVisible(true);
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.pack();
    }

    public JPanel getMainPanel() {
        return mainPanel;
    }

    private JPanel createBtnPanel(String[][] texts, String title){
        JPanel btnPanel = new JPanel();
        int rows = texts.length;
        int cols = texts[0].length;
        btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));

        for(int row = 0; row < texts.length; row++){
            for(int col = 0; col < texts[row].length; col++){
                JButton btn = new JButton(texts[row][col]);
                btn.setFont(BTN_FONT);
                btnPanel.add(btn);
            }
        }
        btnPanel.setBorder(BorderFactory.createTitledBorder(title));
        return btnPanel;
            }
    }

class HandMenu {
    private static final String PLAYER1 = "Player 1";
    private static final String PLAYER2 = "Player 2";
    private static final String PLAYER3 = "Player 3";
    private static final String PLAYER4 = "Player 4";
    private HandGui gui;
    private JMenuBar menuBar = new JMenuBar();
    private JMenuItem p1Hand;
    private JMenuItem p2Hand;
    private JMenuItem p3Hand;
    private JMenuItem p4Hand;

    HandMenu(HandGui gui) {
        this.gui = gui;
        p1Hand = new JMenuItem(PLAYER1, KeyEvent.VK_1);
        p2Hand = new JMenuItem(PLAYER2, KeyEvent.VK_2);
        p3Hand = new JMenuItem(PLAYER3, KeyEvent.VK_3);
        p4Hand = new JMenuItem(PLAYER4, KeyEvent.VK_4);
        ViewAction viewAction = new ViewAction();
        p1Hand.addActionListener(viewAction);
        p2Hand.addActionListener(viewAction);
        p3Hand.addActionListener(viewAction);
        p4Hand.addActionListener(viewAction);
        p1Hand.setEnabled(false);
        JMenu viewMenu = new JMenu("Change Players");
        viewMenu.setMnemonic(KeyEvent.VK_P);
        viewMenu.add(p1Hand);
        viewMenu.add(p2Hand);
        viewMenu.add(p3Hand);
        viewMenu.add(p4Hand);
    }

    public JMenuBar getJMenuBar(){
        return menuBar;
    }

    private class ViewAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String command = e.getActionCommand();
            if(command.equals(PLAYER1)){
                gui.p1PanelSetVisable(true);
                gui.p2PanelSetVisable(false);
                gui.p3PanelSetVisable(false);
                gui.p4PanelSetVisable(false);
                p1Hand.setEnabled(false);
                p2Hand.setEnabled(true);
                p3Hand.setEnabled(true);
                p4Hand.setEnabled(true);
            } else if(command.equals(PLAYER2)){
                gui.p1PanelSetVisable(false);
                gui.p2PanelSetVisable(true);
                gui.p3PanelSetVisable(false);
                gui.p4PanelSetVisable(false);
                p1Hand.setEnabled(true);
                p2Hand.setEnabled(false);
                p3Hand.setEnabled(true);
                p4Hand.setEnabled(true);
            } else if(command.equals(PLAYER3)){
                gui.p1PanelSetVisable(false);
                gui.p2PanelSetVisable(false);
                gui.p3PanelSetVisable(true);
                gui.p4PanelSetVisable(false);
                p1Hand.setEnabled(true);
                p2Hand.setEnabled(true);
                p3Hand.setEnabled(false);
                p4Hand.setEnabled(true);
            } else if(command.equals(PLAYER4)){
                gui.p1PanelSetVisable(false);
                gui.p2PanelSetVisable(false);
                gui.p3PanelSetVisable(false);
                gui.p4PanelSetVisable(true);
                p1Hand.setEnabled(true);
                p2Hand.setEnabled(true);
                p3Hand.setEnabled(true);
                p4Hand.setEnabled(false);
            }
        }
    }
}

这是我第一次在堆栈溢出上发帖,如果我没有正确说明我的问题,我很抱歉。

【问题讨论】:

  • 要使窗口更大,您需要设置框架的大小 - frame.setSize(500,500);
  • @NinadPingale 还是让pack处理吧,OP正在做的,考虑到跨平台框架装饰,问题更深

标签: java swing jframe


【解决方案1】:

BorderLayout 只允许单个组件占据给定位置,所以...

mainPanel.add(p1Panel, BorderLayout.CENTER);
mainPanel.add(p2Panel, BorderLayout.CENTER);
mainPanel.add(p3Panel, BorderLayout.CENTER);
mainPanel.add(p4Panel, BorderLayout.CENTER);

表示只会显示p4Panel...

对于面板之间的切换,您最好使用CardLayout 而不是...

p1Panel.setVisible(true);
p2Panel.setVisible(false);
p3Panel.setVisible(false);
p4Panel.setVisible(false);

这就是为什么你的框架是空白的,因为p4Panel 是不可见的,但它是BorderLayout 将尝试布局的唯一组件...

现在,基本上据我所知,HandMenu 中的任何内容都没有应用于任何 UI 组件(没有设置任何菜单)...

您需要将JMenu 添加到menuBar,例如...

menuBar.add(viewMenu);

我建议不要查看其他人的示例,而是查看:

【讨论】:

    【解决方案2】:

    您不能将多个组件添加到面板的中心

        mainPanel.add(p1Panel, BorderLayout.CENTER);
        mainPanel.add(p2Panel, BorderLayout.CENTER);
        mainPanel.add(p3Panel, BorderLayout.CENTER);
        mainPanel.add(p4Panel, BorderLayout.CENTER);
        p1Panel.setVisible(true);
        p2Panel.setVisible(false);
        p3Panel.setVisible(false);
        p4Panel.setVisible(false);
    

    要做你想做的事,你需要一个带有CardLayout的代理面板

        JPanel proxyPanel = new JPanel(new CardLayout());
        proxyPanel.add(p1Panel, "0");        
        proxyPanel.add(p1Panel, "1");
        proxyPanel.add(p1Panel, "2");
        proxyPanel.add(p1Panel, "3");
        mainPanel.add(proxyPanel, BorderLayout.CENTER);
    

    不要使用setVisible(boolean)。要使索引为 1 的面板可见,请使用 CardLayout.show(mainPanel, "1")

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2013-10-22
      • 2013-03-19
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多