我有一个按钮,它在另一个类中运行一个函数。按钮单击事件处理如下:
JPanel ne=new JPanel();
JButton startButton=new JButton("START");
public void actionPerformed(ActionEvent e)
{
System.out.println("Welcome to Guess the number Game");
System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
ne.remove(startButton);
gamer2 game=new gamer2();
game.generatenum();
}
JButton startButton
已添加到JPanel ne
。单击按钮后,actionPerformed(ActionEvent e)
会运行,按钮应该从JPanel中删除。但按钮仍保留在那里直到整个程序完成运行。有人帮我这个吗?
JFrame的完整代码:
package test;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;
public class test3 implements ActionListener {
JButton p=new JButton("START");
JPanel ne=new JPanel();
public void create()
{
Dimension s=new Dimension(400,400);
JFrame l=new JFrame();
l.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
l.setSize(s);
l.setResizable(true);
Dimension s1=new Dimension(400,200);
Dimension s2=new Dimension(400,100);
JPanel me=new JPanel();
JLabel kingsman=new JLabel ("GUESS THE KING'S NUMBER!");
kingsman.setFont(new Font("Serif", Font.BOLD, 45));
JPanel commonPane=new JPanel();
BoxLayout n1=new BoxLayout(commonPane,1);
commonPane.setLayout(n1);
p.setFont(new Font("Serif", Font.BOLD, 40));
p.setPreferredSize(s1);
JTextField tf=new JTextField();
tf.setFont(new Font("Serif", Font.BOLD, 45));
Border border = BorderFactory.createLineBorder(Color.YELLOW, 5);
tf.setBorder(border);
tf.setPreferredSize(s2);
JPanel cn=new JPanel();
cn.add(tf);
//l.add(p);
me.add(kingsman);
ne.add(p);
commonPane.add(me);
commonPane.add(ne);
commonPane.add(cn);
l.add(commonPane);
l.setVisible(true);
p.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
System.out.println("Welcome to Guess the number Game");
System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
ne.remove(p);
ne.updateUI();
gamer2 game=new gamer2();
game.generatenum();
}
public static void main(String args[])
{
test3 ob=new test3();
ob.create();
}
}
答案 0 :(得分:2)
在正常情况下,类似......
ne.remove(startButton);
ne.revalidate();
ne.repaint();
应该有效。如果这不起作用,那么这表明您在代码中做了其他错误,而您没有向我们展示,您应该考虑提供一个runnable example来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将减少混淆和更好的响应
所以看一下源代码后,我将actionPeformed
方法更新为......
public void actionPerformed(ActionEvent e) {
System.out.println("Welcome to Guess the number Game");
System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
ne.remove(p);
ne.revalidate();
ne.repaint();
//ne.updateUI();
//gamer2 game = new gamer2();
//game.generatenum();
}
这对我来说很好。
但是,我会鼓励您查看How to Use CardLayout以获得更好的替代方案
答案 1 :(得分:2)
GUI上的所有更新(由ne.remove(p);
和ne.updateUI();
启动)将在 actionPerformed(..)
方法完成后完成。因此game.generatenum();
应该只显示新的GUI并尽快返回。
答案 2 :(得分:1)
删除按钮后,重新验证UI,然后重新绘制。
ne.revalidate();
ne.repaint();
这会使UI无效并请求重新绘制。
答案 3 :(得分:0)
您可以调用UI更新方法
en.updateUI();
这将更新此JPanel
内的所有用户界面。