我必须显示一个下拉菜单,当选择新游戏时,会显示一个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();
}
});
}
}
答案 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教程中的部分,了解更多信息和工作示例。