gpt4 book ai didi

java - 选择 JCombobox 时 GUI 卡住,如何在 ActionListener 中使用条件语句在 Swing 应用程序中使用计时器?

转载 作者:行者123 更新时间:2023-12-02 03:15:52 24 4
gpt4 key购买 nike

我正在开发一个登录框架,在该框架中,我使用用户创建的数据库检索和填充 JComboBox,然后根据从 JComboBox 中选择的项目设置 JLabel 的文本。当用户从 JComboBox 选择一个项目时,我想延迟执行并在 JLabel 中显示“正在连接...”文本,但是当我选择一个项目时,GUI 卡住,5 秒后显示“已连接”,它会跳过“正在连接..” .'JLabel。

非常感谢。

package com.softoak.dba;

import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javax.swing.JComboBox;

public class Login{

private JFrame frame;
static ArrayList<String> dbcom = new ArrayList<String>();
static String[] usecom;
JLabel status = new JLabel("•");
JLabel lblNotConnected;

/**
* Launch the application.
*/
public static void main(String[] args) throws Exception{
Connection m_Connection = DriverManager.getConnection("jdbc:sqlserver://localhost;integratedSecurity=true");

String dbs = "SELECT * FROM sys.databases WHERE owner_sid != 1";

Statement st = m_Connection.createStatement();

ResultSet m_ResultSet = st.executeQuery(dbs);
dbcom.add("-None-");

while(m_ResultSet.next()){
dbcom.add(m_ResultSet.getString(1));
}
usecom = new String[dbcom.size()];
usecom = dbcom.toArray(usecom);

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Login window = new Login();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public Login() {
initialize();
}

/**
* Initialize the contents of the frame.
*/

private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

status.setBounds(385, 235, 10, 10);
status.setForeground(Color.red);
frame.getContentPane().add(status);

JLabel lblLoginApplication = new JLabel("Login Application");
lblLoginApplication.setFont(new Font("Lucida Calligraphy", Font.BOLD, 20));
lblLoginApplication.setBounds(120, 25, 220, 30);
frame.getContentPane().add(lblLoginApplication);

JComboBox comboBox = new JComboBox(usecom);
comboBox.setBounds(230, 80, 110, 30);
comboBox.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if (comboBox.getSelectedIndex() == 1 || comboBox.getSelectedIndex() == 2) {
lblNotConnected.setText("Connecting...");
try{
Thread.sleep(5000);
}catch(InterruptedException ex){
JOptionPane.showMessageDialog(null,ex.getMessage());
}
status.setForeground(Color.green);
lblNotConnected.setText("Connected");
JOptionPane.showMessageDialog(null, "Connected");
}
else{
status.setForeground(Color.red);
lblNotConnected.setText("Not Connected");
}
}
});
frame.getContentPane().add(comboBox);

JLabel lblSelectDatabase = new JLabel("Select Database");
lblSelectDatabase.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 14));
lblSelectDatabase.setBounds(91, 79, 129, 30);
frame.getContentPane().add(lblSelectDatabase);

lblNotConnected = new JLabel("Not Connected");
lblNotConnected.setFont(new Font("Elephant", Font.PLAIN, 12));
lblNotConnected.setBounds(280, 230, 110, 20);
frame.getContentPane().add(lblNotConnected);
}

}

最佳答案

在监听器中执行的代码在事件调度线程(EDT)上执行。当您使用 Thread.sleep() 时,这会导致 EDT hibernate ,这意味着 GUI 无法重新绘制自身。阅读 Swing 教程中关于 Concurrency 的部分了解更多信息。

由于上述原因,任何可能长时间运行的任务都不应该在 EDT 上执行。相反,您应该使用单独的线程。查看上述教程中的 SwingWorker。您可以在那里使用 Thread.sleep() 并发布值以根据需要显示。

但是,为什么您希望用户等待 5 秒钟?我知道我会感到沮丧。

也许您应该使用 ProgressMonitor 让用户知道您可能正在执行一个长时间运行的任务。阅读 Swing 教程中关于 How to Use Progress Bars 的部分了解更多信息和工作示例。

关于java - 选择 JCombobox 时 GUI 卡住,如何在 ActionListener 中使用条件语句在 Swing 应用程序中使用计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com