在完成程序执行之前,按钮不会被删除

时间:2015-12-28 06:51:26

标签: java swing jframe jbutton

我有一个按钮,它在另一个类中运行一个函数。按钮单击事件处理如下:

    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();

    }

}

4 个答案:

答案 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内的所有用户界面。