我正在尝试制作Rock,Paper,Scissors游戏,并且我在框架中添加了3个按钮,但是当我启动程序时,两个按钮不会出现,直到你将鼠标悬停在它们上面,任何人都有想法为什么?
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
import java.awt.FlowLayout;
import javax.swing.JOptionPane;
public class RPSFrame extends JFrame {
public static void main(String [] args){
new RPSFrame();
}
public RPSFrame(){
JFrame Frame1 = new JFrame();
this.setSize(500,500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Rock, Paper or Scissors game");
this.setLocationRelativeTo(null);
ClickListener cl1 = new ClickListener();
ClickListener cl2 = new ClickListener();
ClickListener cl3 = new ClickListener();
JPanel panel1 = new JPanel();
JLabel label1 = new JLabel("Result:");
panel1.setLayout(new FlowLayout(FlowLayout.CENTER, 25, 25));
this.add(panel1);
this.setVisible(false);
JPanel panel2 = new JPanel();
JButton Rock = new JButton("Rock");
Rock.addActionListener(cl1);
panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
panel2.add(Rock);
this.add(panel2);
this.setVisible(true);
JPanel panel3 = new JPanel();
JButton Paper = new JButton("Paper");
Paper.addActionListener(cl2);
panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
panel3.add(Paper);
this.add(panel3);
this.setVisible(true);
JPanel panel4 = new JPanel();
JButton Scissors = new JButton("Scissors");
Scissors.addActionListener(cl3);
panel4.setLayout(new FlowLayout(FlowLayout.RIGHT));
panel4.add(Scissors);
this.add(panel4);
this.setVisible(true);
}
private class ClickListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource() == "Rock"){
int AI = new Random().nextInt(3) + 1;
JOptionPane.showMessageDialog(null, "I have been clicked!");
}
}
}
}
答案 0 :(得分:2)
应调用setVisible(true)
语句AFTER
所有组件都已添加到框架中。
您目前有两个setVisible(...)语句,因此您需要摆脱第一个语句。
编辑:
再看一下代码。你有多个setVisible(...)语句。除了最后一个之外,除去它们。
不要为每个按钮创建单独的面板。而是为所有按钮创建一个面板(称为buttonPanel
)。在您的情况下,您可以使用horizontal BoxLayout
。向面板添加一个按钮,然后添加glue
,然后添加一个按钮,然后添加glue
,然后添加最终按钮。然后将此buttonPanel
添加到框架的NORTH。即。 this.add(buttonPanel, BorderLayout.NORTH)
。阅读How to Use Box Layout上Swing教程中的部分,了解有关布局如何工作以及glue
是什么的更多信息。
答案 1 :(得分:2)
问题是JFrame
有默认BorderLayout
。如果仅add(component)
未指定BorderLayout.[POSITION]
例如add(panel, BorderLayout.SOUTH)
,则该组件将添加到CENTER
。问题是每个POSITION只能有一个组件。因此,您看到的唯一组件是您添加的最后一个组件。
现在我不知道在指定位置后,你是否会得到你想要的结果。 BorderLayout可能不合适。但只是为了看到更改,您可以将布局设置为GridLayout(0, 1)
,您将看到该组件。
this.setLayout(new GridLayout(0, 1));
如果这不是您想要的结果,那么您应该查看Laying out Components within a Container以了解可用的不同布局。
正如我在评论中指出的那样
if(e.getSource() == "Rock"){
如上所述,您试图将对象(最终是一个按钮)与String进行比较。相反,您需要比较actionCommand
String command = e.getActionCommand();
if("Rock".equals(command)){