使用动作侦听器将5x5网格布局添加到JComboBox?

时间:2018-04-09 18:50:59

标签: java swing jframe jpanel actionlistener

我必须显示一个下拉菜单,当选择新游戏时,会显示一个5x5区域,我正在为学校项目创建的游戏显示刺客游戏的位置实例。但是当我选择新游戏时,我无法显示网格,但Jcombobox和动作监听器是我所知道的。我如何解决这个问题,以及是否有任何方法可以使其更简单,更有效?

package GUI;

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class mainView {
private static JPanel newGame;
private static JFrame main;

protected static void newGamePanel() {
    // TODO Auto-generated method stub

    GridLayout lay = new GridLayout(5,5);
    newGame = new JPanel();
    newGame.setLayout(lay);
    newGame.setVisible(true);
    newGame.setLocation(200, 300);
    newGame.setSize(200,200);
    main.add(newGame);

}

public static void codeNameView(){
    main = new JFrame("CodeNames");
    main.setSize(400, 600);
    main.setVisible(true);
    //dropdown menu for quit and new game
    String[] choice = {" " , "New Game" , "Quit"};
    final JComboBox<String> dropDown = new JComboBox<String>(choice);

    //below is the panel where we add new game and quit too
    JPanel dropDownPanel = new JPanel();
    dropDownPanel.add(dropDown);
    main.add(dropDownPanel);
    //ok button stuff


    //action listener for dropdown combobox
    dropDown.addActionListener(new ActionListener(){
      //functionality for combobox
        @Override
        public void actionPerformed(ActionEvent e) {

            // TODO Auto-generated method stub
            JComboBox cb = (JComboBox) e.getSource();
            Object selectedOption = dropDown.getSelectedItem();
           // Object command = e.getActionCommand();
            if (selectedOption == "Quit") {
                 main.dispose();    
            }else if(selectedOption == "New Game"){

                newGamePanel();

            }


                }


    });

}








public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            codeNameView();
        }
    });
}

}

1 个答案:

答案 0 :(得分:0)

首先,不要在班级中使用静态变量和方法。这表明设计不当。

  

但是当我选择新游戏

时,我无法显示网格

将组件添加到可见GUI时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();

您需要使用revalidate来调用布局管理器,以便为面板添加的组件具有大小/位置。否则,组件的大小为(0,0),因此无需绘制任何内容。

  

动作听众根据我的知识开展工作。

或许问题是你的代码永远不会被执行。你怎么验证这个?

您是否向侦听器添加了System.out.println(...)语句以验证执行了哪一段代码???

if (selectedOption == "Quit") {
     main.dispose();    
}else if(selectedOption == "New Game"){

    newGamePanel();

}

不要使用&#34; ==&#34;用于字符串比较。

要比较String的值,请使用equals(...)方法:

if ("New Game".equals(selectedOption))
    //  do something

编辑:

  

字符串本身打印和newGamePanel();

此外,您的代码只是继续向框架添加组件。 Swing实际上绘制了最后添加的组件。因此,如果您向框架添加多个游戏面板,添加的第一个游戏面板将始终涂在添加的最后一个面板的顶部。

因此,更好的解决方案是在框架上使用CardLayout。这将允许您交换面板,以便一次只显示一个面板。阅读How to Use CardLayout上Swing教程中的部分,了解更多信息和工作示例。