正在执行的执行顺序是: 首先,我需要输入正确的密码 然后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
答案 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);
}
}
});
}