gpt4 book ai didi

Java:按钮在未被点击的情况下被激活

转载 作者:行者123 更新时间:2023-12-02 04:50:34 24 4
gpt4 key购买 nike

问题:我的代码应该在按下按钮时创建 JPanel,但代码一开始运行就创建 JPanel。

我正在 Eclipse Luna 上使用 Java SE7 进行编写,我的操作系统是 Windows 8.1。

我一直在尝试编写一个具有固定“窗口”(我使用的是 JFrame)并且可以在“屏幕”(JPanel)之间切换的程序。切换应该使用按钮来完成。目前,我已经在主函数中创建了第一个面板和框架,并添加了一个按钮。然后我添加了一个 actionPerformed 方法来创建第二个面板。我已将 JFrame 作为字段变量,以便该方法可以识别它。

问题是,当我运行代码时,第二个面板就显示出来了,根本没有按钮的迹象。

这是我的主类(包括 actionPerformed 方法):

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Container;

public class WindowOne implements ActionListener{
//A JFrame field is created
public static JFrame frame = new JFrame("JFrame");

public static void main(String[] args) {

//Not sure what this line does
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Sets dimensions of frame
frame.setBounds(100, 100, 600, 600);

//Create an instance of GamePanel (a separate class)
GamePanel gamePanel = new GamePanel();
//Set this panel to the frame
frame.setContentPane(gamePanel);

//Create new button panelButton
JButton panelButton = new JButton("Welcome");
//Create instance of WindowOne
WindowOne listener = new WindowOne();
//Adds action listener to panelButtom
panelButton.addActionListener(listener);

//Add panelButton to the panel
gamePanel.add(panelButton);

//Display frame AFTER adding all components to it
frame.setVisible(true);
}


//This method is called when the panelButton is clicked (at least, that's what's supposed to happen)
public void actionPerformed(ActionEvent e) {
GamePanel gamePanel2 = new GamePanel();
gamePanel2.paint(null);
frame.setContentPane(gamePanel2);
}
}

这是另一个类,GamePanel,我用它来创建和“绘制”面板(我的 friend ,一位更有经验的程序员,坚持我使用这个类,而不仅仅是以基本方式制作面板)。

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;


public class GamePanel extends JPanel {

public GamePanel(){

}

public void paint(Graphics g){
//Use this method with instances of GamePanel to design different panels
g.fillRect(10,10,10,10);
}
}
<小时/>

已答复!我将所有内容简化为一个类,如果将来有人发现它有用,这里是更正的代码。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;

public class WindowOne{
//A JFrame field is created
public static JFrame frame = new JFrame("JFrame");

public static void main(String[] args) {

//FRAME STUFF
//Not sure what this line does
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Sets dimensions of frame
frame.setBounds(100, 100, 600, 600);

//PANEL STUFF
//Create the first panel
JPanel panelOne = new JPanel();
//Set this panel to the frame
frame.setContentPane(panelOne);

//BUTTON STUFF
//Create new button panelButton
JButton panelButton = new JButton("Welcome");
//Add anonymous action listener to panelButton
panelButton.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent ae){
//What happens when button is clicked:
JPanel panelTwo = new JPanel();
panelTwo.setBackground(Color.black);
frame.setContentPane(panelTwo);
frame.setVisible(true);
}
});

//OTHER STUFF

//Add panelButton to the panel
panelOne.add(panelButton);

//Display frame AFTER adding all components to it
frame.setVisible(true);
}
}

最佳答案

您添加的第一个面板也是一个 GamePanel 实例,这就是您看到一个正方形的原因。这是因为第一个面板也在绘制一个正方形,而不是因为第二个面板已经在您的 JFrame 上。

编辑:一些额外的提示:

-永远不要直接调用组件的paint方法,框架会为你做这件事。如果您想告诉它您想要再次绘制组件,请调用 repaint() 方法。

-当重写 Component 上的 paint(Graphics g) 方法时,最佳做法是首先调用父类(super class)的方法:super.paint(g )。这将完成诸如绘制背景之类的事情。

- 不应重写 paint(Graphics g) 方法,而应重写 swing 组件中的 paintComponent(Graphics g) 类。更多信息here .

-您可以创建匿名 ActionListener 实例,而不是让您的组件像这样实现它们:

panelButton.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent ae){
//your code when button is clicked
}
});

(如果您使用的是 java 8,甚至只是一个 lambda)

关于Java:按钮在未被点击的情况下被激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29273225/

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