【问题标题】:Why won't my buttons appear when I run this JFrame?当我运行这个 JFrame 时,为什么我的按钮不会出现?
【发布时间】:2014-04-26 00:21:53
【问题描述】:

我正在尝试制作一个石头剪刀布游戏,我在框架中添加了 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!");
        }
    }
}

}

【问题讨论】:

  • if(e.getSource() == "Rock"){ 您正在尝试将字符串与对象进行比较

标签: java swing


【解决方案1】:

应该调用setVisible(true) 语句AFTER 所有组件都已添加到框架中。

你目前有两个 setVisible(...) 语句,所以你需要去掉第一个。

编辑:

  1. 再次查看代码。您有多个 setVisible(...) 语句。除了最后一个之外,把它们全部清除掉。

  2. 不要为每个按钮创建单独的面板。相反,您为所有按钮创建一个面板(称为buttonPanel)。在您的情况下,您可以使用horizontal BoxLayout。在面板中添加一个按钮,然后添加glue,然后添加一个按钮,然后添加glue,然后添加您的最终按钮。然后将此buttonPanel 添加到框架的北部。 IE。 this.add(buttonPanel, BorderLayout.NORTH)。阅读 How to Use Box Layout 上的 Swing 教程部分,了解有关布局如何工作以及 glue 是什么的更多信息。

【讨论】:

  • 你这是什么意思?
【解决方案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"){

通过上述方法,您试图将一个对象(最终是一个按钮)与一个字符串进行比较。相反,您需要比较 actionCommand

String command = e.getActionCommand();
if("Rock".equals(command)){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2019-09-13
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2017-03-23
    • 2013-01-03
    相关资源
    最近更新 更多