我有一个JButton,当我点击它时,我从数据库加载一些数据+初始化一个有很多控件的JDialog +用加载的数据填充那些控件然后显示慢JDialog.这需要大约3到5秒才能最终显示JDialog,这会导致程序以错误的方式冻结.
我在SwingX中创建了一个带有JXBusyLabel的小型JDialog,以便在加载和初始化这些缓慢的进程时显示繁忙的标签.但是,如何在初始化慢速对话框的同时在EDT中运行这个繁忙的标签JDialog?
注意:从db加载数据并不慢,但初始化繁重的JDialog及其组件会导致处理速度变慢.
我有一个基本的服务器工作,但我希望能够按下GUI中的按钮来运行所述服务器.
目前,当我按下按钮运行服务器时,按钮保持按下状态,GUI的其余部分无法访问,直到我强制在Netbeans中停止它.我想包括按钮来停止服务器等所以我想知道如何在后台运行服务器代码,同时与GUI交互其他任何东西.
我怎样才能在GUI中实现这一目标?
我最近了解到Sun的/ Oracle最新指南说,任何Swing对象(包括构造函数)的Swing方法都不能在EDT之外调用.
相同的严格标准是否也适用于所有"视觉"AWT课程?如果没有,**对他们来说是什么规则?
后来
re Swing和EDT:2009年的讨论.
引用:"除了实际的线程安全性和相关问题,如可见性和同步,我认为是一个软件问题.Swing组件通常具有某种类型的"监听器",并且这些监听器设计为在EDT上执行.
由于这些侦听器是异步的并且响应事件(如属性更改),因此可以在构建GUI时触发这些侦听器.结果是,当您在主线程中构建时,某些侦听器正在EDT上执行,并且一些侦听器也可能在其他线程上运行(因为侦听器混淆并在错误的线程上触发).结果是巨大的不可预测的混乱."
也许他们不知道他们在谈论什么......但目前我采取的是"更安全而不是抱歉"的方法.Potochkin,http: //weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html 似乎也认为我们熟悉后来更严格的规则
我是新手,还在学习它的来龙去脉.我写了一个基本代码并开始尝试EDT.这是代码:
public class SwingDemo2 extends Thread implements ActionListener {
JLabel jl;
SwingDemo2() {
JFrame jfr = new JFrame("Swing Event Handling");
jfr.setSize(250, 100);
jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jl = new JLabel("Press a button!", SwingConstants.CENTER);
System.out.println("After Label: " + SwingUtilities.isEventDispatchThread());
JButton jb1 = new JButton("OK");
jb1.setActionCommand("OK");
jb1.addActionListener(this);
JButton jb2 = new JButton("Reset");
jb2.setActionCommand("Reset");
jb2.addActionListener(this);
jfr.add(jl, BorderLayout.NORTH);
jfr.add(jb1, BorderLayout.WEST);
jfr.add(jb2, BorderLayout.EAST);
System.out.println("After adding: " + SwingUtilities.isEventDispatchThread());
jfr.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("In main: " + SwingUtilities.isEventDispatchThread()); …Run Code Online (Sandbox Code Playgroud) java swing multithreading event-handling event-dispatch-thread
我想让用户了解I/O操作的进度.目前我有一个内部课程,在我启动I/O之前启动,并在完成后停止.它看起来像这样:
class ProgressUpdater implements Runnable {
private Thread thread;
private long last = 0;
private boolean update = true;
private long size;
public ProgressUpdater(long size) {
this.size = size;
thread = new Thread(this);
}
@Override
public void run() {
while (update) {
if (position > last) {
last = position;
double progress = (double) position / (double) size * 100d;
parent.setProgress((int) progress);
}
}
}
public void start() {
thread.start();
}
public void stop() {
update = false;
parent.setProgress(100);
} …Run Code Online (Sandbox Code Playgroud) java swing multithreading jprogressbar event-dispatch-thread
我已经制作了一个非常简单的代码来显示它,我有一个按钮,应该显示一个JDialog来检查进度状态,我使用调用后期通过EDT而我的循环不在run方法中,所以为什么不是我的酒吧更新?这是代码
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JBarEx extends JFrame {
private JTextField progStatus = new JTextField("Undefined");
private JButton dialogBtn = new JButton("Show Progression dialog");
final JDialog dlg = new JDialog((JFrame) null, "prog Title", false);
final JProgressBar dpb = new JProgressBar(0, 100);
public JBarEx() {
JPanel pan = new JPanel();
dialogBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated …Run Code Online (Sandbox Code Playgroud) 我不是新手,也是教授.在Java上.我正在尝试将progressBar添加到我的应用程序中,该应用程序使用isReachable()方法将ping发送到给定的ip范围.我该如何添加?我不知道任务和线程使用情况.我阅读了有关progressBar的java文档,但我无法添加.这是我的代码
final JButton btnScan = new JButton("Scan");
btnScan.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Runtime rt = Runtime.getRuntime();
String lastIpCheck = " ";
String ip = textField.getText();
String lastIp = textField_1.getText();
String parsedOutput= " ";
InetAddress inet;
boolean reachable;
while(!(lastIpCheck.equalsIgnoreCase(lastIp))) {
try {
inet = InetAddress.getByName(ip);
reachable = inet.isReachable(2500);
String output=null;
lastIpCheck = f.nextIpAddress(ip);
if(reachable) {
model.addElement(ip);
}
ip = lastIpCheck;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} …Run Code Online (Sandbox Code Playgroud) 我想显示状态消息,当单击按钮触发的处理达到不同的处理阶段时,动态更新.你能帮忙吗?这是我使用的代码,但不起作用.它总是在函数结束时显示状态msg,而不是在执行时显示中间状态msgs.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.*;
import java.net.*;
import java.io.*;
public class MainApplet extends JApplet {
JButton gstbtn = new JButton("Connect to Gst Hotspot");
JButton wifibtn = new JButton("Connect to existing Wifi networks");
JLabel status = new JLabel();
JPanel toppanel = null, nwConfigDialog = null;
final JFrame f= new JFrame();
JTextField ssidTxt;
JPasswordField pwdTxt;
JOptionPane opt;
public void init() {
gstbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Gst Hotspot connect workflow triggered"); …Run Code Online (Sandbox Code Playgroud) 我想要做的是在进程发生时显示带有进度条的新面板.
我的代码如下:
case "GoButton":
cards.show(this, "pp");
this.test();
cards.show(this, "panel1");
break;
Run Code Online (Sandbox Code Playgroud)
这是一种actionPerformed方法
但是当我运行程序时它只是忽略第一个cards.show,它执行test代码然后执行第二个cards.show
如果您需要,我还会为您提供其余的代码
public CreatePanel(JFrame frame) {
ext = new ArrayList<>();
files = new ArrayList<>();
this.mainWindow = frame;
this.setSize(256, 256);
cards = new CardLayout();
this.setLayout(cards);
panel1 = new JPanel(null);
createPanel1(panel1);
this.add(panel1, "panel1");
panel2 = new JPanel(null);
createPanel2(panel2);
this.add(panel2, "panel2");
panel3 = new JPanel(null);
createPanel3(panel3);
this.add(panel3, "pp");
cards.show(this, "panel1");
}
public class ProgressPanel {
private static JPanel panel;
private static JProgressBar progressBar;
private static …Run Code Online (Sandbox Code Playgroud) 我对Swing Event Dispatcher Thread(EDT)的理解是,它是执行事件处理代码的专用线程。因此,如果我的理解是正确的,那么在下面的示例中:
private class ButtonClickListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
// START EDT
String command = e.getActionCommand();
if( command.equals( "OK" )) {
statusLabel.setText("Ok Button clicked.");
} else if( command.equals( "Submit" ) ) {
statusLabel.setText("Submit Button clicked.");
} else {
statusLabel.setText("Cancel Button clicked.");
}
// END EDT
}
}
Run Code Online (Sandbox Code Playgroud)
在之间的所有代码START EDT,并END EDT在在美国东部时间执行,并且它的任何代码以外的主应用程序线程上执行。同样,另一个示例:
// OUTSIDE EDT
JFrame mainFrame = new JFrame("Java SWING Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×10
jprogressbar ×3
awt ×1
java-8 ×1
jlabel ×1
jpanel ×1
ping ×1
thread-sleep ×1