setVisible()doen会立即生效,因为JFrame会等待某些事情

时间:2015-06-26 08:52:07

标签: java swing jframe actionlistener actionevent

正在执行的执行顺序是: 首先,我需要输入正确的密码 然后JOptionPane msgBox弹出 我点击了'#34; ok"按键 然后在JFrame中没有任何反应,但根据actionPerformed下的代码,textField应设置为可见。 我注意到当我将JFrame的状态从最大化更改为最小化或反之亦然时,textField变得可见。 我需要JFrame立即更改而无需等待任何鼠标事件或因为我没有涉及任何事件。

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

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class GraphicItems extends JFrame{
    private JPasswordField password = new JPasswordField(10);
    private JTextField textField;

    public GraphicItems(){
        super("Graphics is fun");
        setLayout(new FlowLayout());
        textField = new JTextField("This secret will reveal after correct password");
        textField.setEditable(false);
        textField.setVisible(false);
        add(textField);
        add(password);

        HandlerClass theHandler = new HandlerClass();
        password.addActionListener(theHandler);
    }//end graphicItems constructor

    private class HandlerClass implements ActionListener{
        public void actionPerformed(ActionEvent event){
            if(event.getSource()==password)
                if(password.getText().equalsIgnoreCase("kamal123")){
                    JOptionPane.showMessageDialog(null,"CorrectPassword","MessageBox",JOptionPane.INFORMATION_MESSAGE);
                    textField.setVisible(true);
                }//end if
        }//end actionPerformed
    }//end HandlerClass
}//end graphicItems Class

public class MainClass{
    public static void main(String args[]){
        GraphicItems frameObj = new GraphicItems();
        frameObj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameObj.setSize(500,500);
        frameObj.setVisible(true);
    }//main method ended    
}//MainClass ended

2 个答案:

答案 0 :(得分:1)

您必须repaint()您的组件才能看到更改,这是您最小化和最大化窗口时发生的情况。

检查this answer以查看使用repaint()

的正确方法

答案 1 :(得分:1)

actionPerformed在单个AWT事件处理线程上执行。 在此期间,其他事件都没有机会。 通过 invokeLater()推迟,您可以快速结束事件处理,并允许setVisible工作。

@Override
public void actionPerformed(ActionEvent event) {
    SwingUtilites.invokeLater(new Runnable() {
        @Override
        public void run() {
            if (event.getSource() == password
                && password.getText().equalsIgnoreCase("kamal123")) {
                    JOptionPane.showMessageDialog(null,
                        "CorrectPassword", "MessageBox", JOptionPane.INFORMATION_MESSAGE);
                textField.setVisible(true);
            }
        }
    });
}