出于一些尴尬的原因,每当我在actionPerformed()内部将我想要的帧设置为Visible(true)时,它会打印出框架,标题但没有组件,也没有我之前选择的颜色。
但是,当我在当前帧的顶部将可见性设置为true时(无需按下按钮),它可以正常工作。
这是我正在使用的框架:
但是,一旦我在actionPerformed:
中将可见性设置为true,就会打印出来
我已经在actionPerformed()中设置了另一个框架(主客户端框架),并且工作正常。这是我第一次遇到这个问题,所以我真的不确定是什么原因造成的。
我还假设可能是因为在actionPerformed期间客户端必须连接到特定的服务器细节,但是然后再次,第一帧被实例化时,Frame对象被实例化,所以它应该是很好..
这是我的actionPerformed(),抱歉凌乱的代码:
JButton connectButton = new JButton("Connect");
connectButton.setBackground(SystemColor.activeCaption);
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//If any of the first three fields are empty, turn them red
if(serverField.getText().equalsIgnoreCase("")){
lblSever.setForeground(new Color(240, 128, 128));
}
if(channelField.getText().equalsIgnoreCase("")){
lblChannel.setForeground(new Color(240, 128, 128));
}
if(nicknameField.getText().equalsIgnoreCase("")){
lblNickname.setForeground(new Color(240, 128, 128));
}
//Set Waiting Connection frame to true
wc.setVisible(true);
//None of the first three fields are empty
if(!serverField.getText().equalsIgnoreCase("")
&& !channelField.getText().equalsIgnoreCase("")
&& !nicknameField.getText().equalsIgnoreCase("")){
//Set current frame visibility to false
setVisible(false);
//Set connection details
Main.bot.setServer(serverField.getText());
Main.bot.setChannel(channelField.getText());
Main.bot.setNickname(nicknameField.getText());
Main.bot.setPassword(formattedTextField.getText());
//Connect to server and channel
try{
Main.bot.connect(serverField.getText());
Main.bot.changeNick(nicknameField.getText());
Main.bot.joinChannel(channelField.getText());
}catch(Exception e){ //Catch all errors, if invalid server is thrown, close Waiting Connection frame
InvalidServer error = new InvalidServer();
e.printStackTrace();
wc.setVisible(false);
wc.dispose();
error.setVisible(true);
}
setVisible(false);
//Custom Timer class
Timer runTime = new Timer();
while(runTime.getTimeElapsed() < 5000){
//To-Do
}
wc.setVisible(false);
//Instantiate next frame
MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true);
//Kill current frame
dispose();
}
}
});
答案 0 :(得分:2)
在添加所有组件后,最后调用frame.setVisible(true)
。
使用最适合任何延迟的挥杆应用的Swing Timer。
使用SwingUtilities.invokeLater()或EventQueue.invokeLater()确保EDT已正确初始化。
了解更多