gpt4 book ai didi

java - 如何将全局 JPanel 添加到 JFrame

转载 作者:行者123 更新时间:2023-11-30 06:19:22 25 4
gpt4 key购买 nike

我目前正在高中学习编程类(class),我们专注于 Java,其中一个需要构建的程序是石头剪刀布游戏。我很容易做到这一点并且它有效但我决定尝试弄清楚如何让它在自己的窗口中工作。这促使我研究 JFrames 以及如何使用它们。我已经查找了很多教程来介绍它,并且我从 oracle 站点保存了 5 个不同的示例以供引用,但我无法弄清楚为什么这个程序不起作用。

package rps;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* Name: Steven Biro
* Course Code: ICS3U
* Teacher: Mr.Carron
* Date: 23-Apr-2014
* Program Description:
*/
public class RPS
implements ActionListener {
static JPanel text,buttons;

/**
* @param args the command line arguments
*/
public void RPS() {
JButton Rock,Paper,Scissors;
buttons = new JPanel();
Rock = new JButton("Rock");
Paper = new JButton("Paper");
Scissors = new JButton("Scissors");
Rock.setMnemonic(KeyEvent.VK_D);
Paper.setMnemonic(KeyEvent.VK_M);
Scissors.setMnemonic(KeyEvent.VK_E);
Rock.setActionCommand("Rock");
Paper.setActionCommand("Paper");
Scissors.setActionCommand("Scissors");
Rock.addActionListener(this);
Paper.addActionListener(this);
Scissors.addActionListener(this);
buttons.add(Rock);
buttons.add(Paper);
buttons.add(Scissors);

}

public void actionPerformed(ActionEvent e) {
String PC,Player;
int outcome;
PC="";
Player=(e.getActionCommand());
int computer = (int)(Math.random()*3+1);
if (computer==1) {
PC="Rock";
} else if (computer==2) {
PC="Paper";
} else {
PC="Scissors";
} if (Player.equals(PC)) {
outcome=0; //tied
} else {
if ("Rock".equals(PC)) {
if ("Paper".equals(Player)) {
outcome=1; //win
} else {
outcome=2; //lose
}
} else if ("Paper".equals(PC)) {
if ("Scissors".equals(Player)) {
outcome=1; //win
} else {
outcome=2; //lose
}
} else {
if ("Rock".equals(Player)) {
outcome=1; //win
} else {
outcome=2; //lose
}
}
}
JLabel r;
if (outcome==0) {
r = new JLabel ("You Tied.");
} else if (outcome==1) {
r = new JLabel ("You Win.");
} else if (outcome==2) {
r = new JLabel ("You Lose.");
} else {
System.exit(2);
r = new JLabel ("wont ever execute");
}
text = new JPanel();
text.add(r);
}

public static void GUI() {
//Create and set up the window.
JFrame frame = new JFrame("RockPaperScissors");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
frame.add(buttons);
frame.add(text);

//Display the window.
frame.pack();
frame.setVisible(true);
frame.setSize(250,150);
}


public static void main(String[] args) {

GUI();

}

}

如果您能帮我弄清楚为什么称为“按钮”和“文本”的 JPanel 不会添加,我将不胜感激。

如果我删除

        //Create and set up the content pane.
frame.add(buttons);
frame.add(text);

从我的程序,然后它运行没有问题,只是一个空白窗口,正如预期的那样,所以我不知道该怎么做。

编辑:更正从 public void RPS() {

中删除 void 后出现的错误

线程“main”中的异常 java.lang.NullPointerException
在 java.awt.Container.addImpl(Container.java:1091)
在 java.awt.Container.add(Container.java:1003)
在 javax.swing.JFrame.addImpl(JFrame.java:564)
在 java.awt.Container.add(Container.java:415)
在 rps.RPS.GUI(RPS.java:102)
在 rps.RPS.main(RPS.java:114)
拿起 _JAVA_OPTIONS: -Djava.net.preferIPv4Stack=true
Java 结果:1

如果我从 static JPanel text,buttons; 中删除 static,那么 netbeans 会“更正”每个方法,因此它永远不会为任何方法说 static它们包括 Main,所以它说找不到 main。

对不起,如果我给人的印象是愚蠢的,但如果有人能帮我解决这个问题,我将不胜感激。

最佳答案

  • 您永远不会通过 new RPS() 在任何地方创建 RPS 实例。
  • 你的 RPS 类中有一个“伪构造函数”。即,这个 public void RPS() { 不是构造函数。摆脱 void 返回类型,因为构造函数应该没有返回类型:public RPS() {
  • 您的 Swing 组件字段绝不能是静态的。
  • 您在不考虑布局管理器 BorderLayout 的情况下向 JFrame 添加组件。您当前的代码正在添加空组件,但如果它们不为空,它们都会被添加 BorderLayout.CENTER,最后一个覆盖前一个。
  • 在 RPS 类中创建一个主 JPanel,然后通过非静态方法将其添加到 main 方法中的 JFrame。

例如,RPS 可能会扩展 JPanel,如果是这种情况,那么您可以像这样将它添加到 JFrame 中:

JFrame frame = new JFrame("RPS");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new RPS());

其他建议:

  • 检查枚举,因为剪刀石头布很适合这一点,包括提供枚举方法来测试是否获胜
  • 通过使用枚举,以后修改代码以允许其他状态(例如 Lizard 和 Spock)会更容易。
  • 尝试将程序的逻辑部分与 View (GUI 部分)分开。
  • 避免让您的 GUI 类实现您的监听器接口(interface),因为这会导致创建“开关板”监听器,就像您正在编写的那样——需要调试或增强。而是在这里尝试匿名内部类或私有(private)内部类。

关于java - 如何将全局 JPanel 添加到 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com