Tag: event dispatch thread

JavaFx对SwingUtilities.invokeLater的响应

所以我知道JavaFx在使用线程时更新GUI的方法称为Task,但代码的工作方式是否相似或存在差异。 让我举个例子: GUI之外的另一个类作为线程运行 public void run(){ while (socket.isConnected()) { String x = input.next(); System.out.println(x); mg.updateChat(x) } } 在实际的GUI里面 public void updateChat(final String input){ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { txtChat.setText(input); } }); } 任务的工作方式是否完全相同? 或者是否存在差异,是否有如何修改此代码以在JavaFx项目中工作?

制作一个显示“请等待”JDialog的摇摆线程

问题是这样的: 我正在运行一个swing应用程序,在某个时刻,对话框需要插入用户名和密码并按“确定”。 我希望当用户按“确定”时,swing应用程序按此顺序执行: 打开“请等待”JDialog 进行一些操作(最终显示其他一些JDialog或JOptionPane) 当它完成操作时关闭“请等待”JDialog 这是我在okButtonActionPerformed()中编写的代码: private void okButtonActionPerformed(java.awt.event.ActionEvent evt) { //This class simply extends a JDialog and contains an image and a jlabel (Please wait) final WaitDialog waitDialog = new WaitDialog(new javax.swing.JFrame(), false); waitDialog.setVisible(true); … //Do some operation (eventually show other JDialogs or JOptionPanes) waitDialog.dispose() } 这段代码显然不起作用,因为当我在同一个线程中调用waitDialog时,它会阻塞所有代码直到我不关闭它。 所以我试着在另一个线程中运行它: private void okButtonActionPerformed(java.awt.event.ActionEvent evt) { […]

在Java applet中显示FTP文件上载期间的进度

好的,所以我让上传者使用Java FTP上传文件,我想更新标签和进度条。 带有百分比文本的标签,带有百分比int值的栏。 现在使用当前代码只能在上传结束时获得100和完整栏。 在上传过程中,没有一个改变。 这里是: OutputStream output = new BufferedOutputStream(ftpOut); CopyStreamListener listener = new CopyStreamListener() { public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { System.out.printf(“\r%-30S: %d / %d”, “Sent”, totalBytesTransferred, streamSize); ftpup.this.upd(totalBytesTransferred,streamSize); } public void bytesTransferred(CopyStreamEvent arg0) { } }; Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener); } public void upd(long num, long size){ int […]

通过不同的线程访问变量和摆动组件

这个问题与我在这里问的问题有些关系。 现在,我有一个类“Controller”,它由main方法和所有swing组件组成。 有一个名为“VTOL”的类,它由一个名为“altitude”的变量组成(我现在已声明此变量为volatile)。 这是一个由在后台运行的线程组成的类: import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Vineet */ public class Gravity extends Thread { String altStr; double alt; Controller ctrl = new Controller(); @Override public void run() { while (true) { alt=VTOL.altitude; System.out.println(alt); alt = alt-0.01; VTOL.altitude= (int) alt; altStr=new Integer(VTOL.altitude).toString(); ctrl.lblAltitude.setText(altStr); try { Thread.sleep(10); } catch (InterruptedException e) […]

抛出exception时EDT是否重启?

(下面的示例代码是自包含且可运行的,您可以尝试它,它不会崩溃您的系统:) Tom Hawtin在这里评论了这个问题: 为什么人们在事件队列上运行Java GUI 那: EDT不太可能崩溃。 在EDT调度中抛出的未经检查的exception被捕获,转储并且线程继续。 有人可以解释我在这里发生了什么(每次你点击“抛出一个未经检查的exception”按钮,有意地执行除以零): import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class CrashEDT extends JFrame { public static void main(String[] args) { final CrashEDT frame = new CrashEDT(); frame.addWindowListener(new WindowAdapter() { public void windowClosing( WindowEvent e) { System.exit(0); } }); final JButton jb = new JButton( […]

JPanel添加但没有“及时”显示

我有一个显示JPanels的JFrame,具体取决于您单击的MenuItem。 它工作正常,但是现在我需要在将一个JPanel添加到框架并且正在显示它时调用一个方法(因为我在该面板中使用了JFreeChart,当JPanel可见时我必须调用chartPanel.repaint() ) : this.getContentPane().add( myjpanel, BorderLayout.CENTER ); //this = JFrame this.validate(); myjpanel.methodCalledOnceDisplayed(); 看起来好吗? myjpanel真的被展示了吗? 似乎不是: public void methodCalledOnceDisplayed() { chartPanel.repaint() } 这不起作用( chartPanel.getChartRenderingInfo().getPlotInfo().getSubplotInfo(0)抛出IndexOutOfBoundsException)。 这意味着调用重绘时JPanel不可见,我测试了以下内容: public void methodCalledOnceDisplayed() { JOptionPane.showMessageDialog(null,”You should see myjpanel now”); chartPanel.repaint() } 现在它工作了,我看到myjpanel在警报后面,正如预期的那样,chartPanel被重新绘制,并且没有发生exception。 编辑 :SSCCE(需要jfreechart和jcommon: http ://www.jfree.org/jfreechart/download.html) import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Font; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; […]

单击按钮后GUI冻结

我正在尝试创建一个客户端/服务器应用程序。 问题是客户端的确认按钮第一次输入工作,但如果我为另一个输入点击相同的按钮,客户端GUI将冻结。 为什么GUI会冻结? 客户: public class ClientGui { private JFrame frmBookPointOf; private JTextField txtRm; private JTextArea txtrBookDetails; private JTextField textField; private JTextField textField_1; private JTextField textField_2; private JTextField textField_3; private JTextField textField_4; private JTextField textField_5; private JComboBox comboBox_1; private JComboBox comboBox; private dbController dbCtrl; private Connection conn; private static Socket client; private static BufferedReader fromServer […]

启动画面进度条不绘图

我正试图在我的启动画面上创建自己的进度条。 创建我的启动画面很简单: java -splash:EaseMailMain.jpg Main.class(来自Eclipse) 我的main方法的第一行称为: new Thread(new Splash()).start(); 这是泼水类: public class Splash implements Runnable { public volatile static int percent = 0; @Override public void run() { System.out.println(“Start”); final SplashScreen splash = SplashScreen.getSplashScreen(); if (splash == null) { System.out.println(“SplashScreen.getSplashScreen() returned null”); return; } Graphics2D g = splash.createGraphics(); if (g == null) { System.out.println(“g is […]

在Java 7+中,在EDT之外使用Swing repaint()方法是否仍然安全?

我知道,即使使用Swing的线程模型,从任何线程调用repaint()和其他一些选定的方法也是安全的,但是我最近在评论中告诉我,事实并非如此。 谷歌发现很多旧的讨论说它是安全的,但最近没什么。 所有以前说它安全的官方参考文献似乎已经消失了,我在各个论坛上发现了一些人讨论它是如何不再安全的。 我找不到任何正式的东西来确认它是否存在 – 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话。 考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的function。 我真的在寻找一个官方参考(即Javadoc,oracle教程或源代码链接)的链接,说明这些方法是否从任何线程调用都是安全的。 这里提到这个问题: 在EDT之外安全使用Component.repaint()? 从一个现已消失的Sun页面中引用一句话: 从任何线程调用以下JComponent方法都是安全的:repaint(),revalidate()和invalidate()。 repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate()。 这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全。 但另一方面,我找不到任何明确的说这个function已经改变。 改变笔记 可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明。 我找到了“Java 7中的更改”页面,但根本没有提到它,这些页面都没有提到任何方式的线程或EDT: http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html

为什么使用invokeLater很重要?

我最近发现了一个示例代码: public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } createAndShowGUI()方法打开用户界面窗口。 然后我尝试修改代码如下: public static void main(String[] args) { createAndShowGUI(); } 两个版本都同样有效。 有什么不同?