标签: event-dispatch-thread

JFrame以及为什么要继续运行

为什么我创建一个JFrame然后程序仍然运行,直到(即)我用窗口的小"退出按钮"关闭它?

我寻找这个答案,但我失败了.我唯一猜到的是,当我这样做时,new JFrame()它就像一个特殊的new,它在EDT中保留对象的引用,因此它将始终被引用(即使它是一个匿名的"new")并且它不会被删除垃圾收集器.然后,一旦触发了窗口关闭事件,就会取消引用并销毁该对象.

java swing jframe event-dispatch-thread

2
推荐指数
1
解决办法
662
查看次数

如何在java中检测主线程冻结GUI?

我想检测主线程中的某些时间消耗操作导致gui冻结.我的目标是自动设置和取消设置等待光标.

谢谢

java swing cursor event-dispatch-thread

2
推荐指数
1
解决办法
1362
查看次数

需要刷新Java EDT(事件调度队列)

我有一个Java应用程序,其中许多线程正在快速写入StyledTextBox.在某些时候,所有线程都被终止.但是,TextBox继续接收一些文本,大概是因为调度队列有点备份了.是否有可能以某种方式强制刷新EDT,以便在线程终止时,TextBox的更新立即结束?

谢谢你,吉姆

java queue swt dispatch event-dispatch-thread

2
推荐指数
1
解决办法
2382
查看次数

连接按钮不起作用

每当我点击事件按钮时,程序就会没有响应我的代码是否有问题?

void btnConnectActionPerformed(java.awt.event.ActionEvent evt){

    try{
        btnSend.setEnabled(true);
        ServerSocket serverSocket = new ServerSocket(4446);
        Scanner serverType = new Scanner(chatTxt.getText());
        Socket clientSocket = serverSocket.accept();
        InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
        BufferedReader br = new BufferedReader(isr);
        PrintStream ps = new PrintStream(clientSocket.getOutputStream());


    }catch (Exception ex){ex.printStackTrace();}
    } 
Run Code Online (Sandbox Code Playgroud)

java connection swing chat event-dispatch-thread

2
推荐指数
1
解决办法
52
查看次数

applet中的start()方法删除面板

我做了一个小程序.我曾经JPanel设置applet的内容,我在init()方法中start()做,在做其他的事情.当我运行applet时没有包含start()一切正常并且内容出现,但是如果我添加了start()方法,则applet不会显示内容.

这是为什么?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JApplet;
import javax.swing.JEditorPane;
import javax.swing.JPanel;


public class Server extends JApplet {

final static int port = 4444;
ServerSocket listen;
JEditorPane message;
JPanel content;

    public void init(){
        message = new JEditorPane();
        message.setText("Listening...");
        message.setEditable(false);
        message.setVisible(true);

        content = new JPanel();
        content.setLayout(new BorderLayout());
        content.add(message, BorderLayout.NORTH);

        setContentPane(content);
    }

    public void start(){    
         try {
             listen = new ServerSocket(port);
             while(true){   
                Socket client …
Run Code Online (Sandbox Code Playgroud)

java user-interface applet swing event-dispatch-thread

2
推荐指数
1
解决办法
103
查看次数

使用Thread.sleep()的paintComponent(Graphics g)的时间延迟不能按预期工作

我正在制作一个Animated ProgressBar,其中我使用了多fillRect()种类的方法javax.swing.Graphics.
为了在绘制每个矩形后延迟,我使用Thread.sleep(500)延迟方法,(许多论坛建议,延迟).
问题是,在显示每个矩形框后,不是延迟0.5秒,而是在开始时占用所有矩形所需的整个延迟,然后显示最终图像,即进度条.
问题1
为了延迟每个单独的栏,我将延迟" Thread.sleep(500)"与栏" fillRect()"放在一起for() loop,我想知道,为什么它在开始时需要所有的延迟然后重新显示已完成的ProgressBar.
问题2
如何更改我的代码,以便延迟可以与每个矩形条同时发生,所以当我运行程序时,它应该生成一个动画进度条.
码:

import javax.swing.JOptionPane;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;

class DrawPanel extends JPanel
{
    public paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(new Color(71,12,3));
        g.fillRect(35,30,410,90);

        for ( int i=1; i<=40; i+=2)
        {
          Color c = new Color (12*i/2,8*i/2,2*i/2);
          g.setColor(c);
          g.fillRect( 30+10*i,35,20,80);

        try
          { Thread.sleep(500); } 
        catch(InterruptedException ex)
          { Thread.currentThread().interrupt(); }
        }
    }
}

class ProgressBar
{
    public static void main …
Run Code Online (Sandbox Code Playgroud)

java swing paintcomponent event-dispatch-thread progress-bar

2
推荐指数
1
解决办法
7707
查看次数

JProgressBar不会更新

我正在尝试将JProgressBar添加到我的程序中,但它不会更新!只有在100%的原因后,该值才会更改.这是我的方法.

public void downloadImages(List<String> images) {
    if (errorCode == 0) {
        for (int i = 0; i < images.size(); i++) {
            if (errorCode == 0) {
                main.progressLabel.setText("Downloading image " + Integer.toString(i + 1) + " of " + Integer.toString(images.size()));
                String imageStr = images.get(i);
                String imageName = imageStr.substring(imageStr.lastIndexOf("/") + 1);
                try {
                    URL url = new URL(imageStr);
                    InputStream in = url.openStream();
                    OutputStream out = new FileOutputStream(saveDirectory + imageName);

                    byte[] b = new byte[2048];
                    int length;
                    while ((length = in.read(b)) != -1) …
Run Code Online (Sandbox Code Playgroud)

java concurrency swing jprogressbar event-dispatch-thread

2
推荐指数
1
解决办法
1188
查看次数

如何使用wait()和notifyAll()在GUI类和逻辑线程之间进行通信

我的课程中有3个小学课程.第一个扩展applet(并充当我的主要),第二个是一个线程(实现Runnable),它处理与服务器的后端后勤/通信,第三个是JPanel类,它创建GUI(这是创建的)在一个新的线程中通过调用SwingUtilities.invokeAndWait()main(applet)类.

GUI类与后端线程进行多次通信,以使数据显示在屏幕上.我的问题是GUI在后端类为它们提供数据之前显示其组件.所以,我想告诉GUI在另一个线程中调用一个方法,等待从中回听,然后显示其组件.我尝试了几种变体:

Object[] data = backend.Method1(); 
wait();
showComponents(data);
Run Code Online (Sandbox Code Playgroud)

在GUI类上,并放在notifyAll();后端线程的Method1的底部,但我在netbeans中发出警告(在同步上下文之外调用Object.wait),程序在java.lang.illegalmonitorstateexception运行时崩溃.我已经尝试将synchronized关键字添加到两个方法中,但这会导致程序冻结.

我(显然,我很确定)只是在学习多线程:我在这里误解了什么?

我觉得JPanel类没有实现runnable的相关性.

编辑:根据@MadProgrammer的建议,我正在使用SwingWorker,它似乎正在做的伎俩.感谢您指点我,我以前从未听说过它们.

 final JLabel loading = new JLabel("loading");
    loading.setVisible(true);
    add(loading);

    SwingWorker sw = new SwingWorker<Map<String, ArrayList<Time[]>>, Void>() {
        @Override
        public Map<String, ArrayList<Time[]>> doInBackground(){
            System.out.println("doing");
            Map<String, ArrayList<Time[]>> toReturn = dbh.getTimes(specToPass);
            return toReturn;
        }

        public void done(){
            try {
                loading.setVisible(false);
                Map<String, ArrayList<Time[]>> weekMap = new HashMap(this.get());
                showTimes(weekMap);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            } catch (ExecutionException ex) {
                  ex.printStackTrace();
            }
       }
    };
    sw.execute();
Run Code Online (Sandbox Code Playgroud)

如果我没有正确实施,我希望你能告诉我.再次感谢.

java swing multithreading event-dispatch-thread

2
推荐指数
1
解决办法
911
查看次数

Swingworker.done()在完成后冻结GUI几秒钟

我有一个SwingWorker,它在后台读取和处理文件,然后在JTextPane中格式化并显示各种样式的数据.

如果文件很大(超过200K),我将显示一个带进度条的对话框.在SwingWorker的done()方法中,我填充了JTextPane,然后隐藏了对话框.done()方法如下所示:

protected void done() {
   populateTextPane();

   hideProgressDialog();
   System.out.println("After hideProgressDialog");
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,我将看到对话框消失,控制台上的println消息,但GUI再冻结10-15秒,数据在冻结结束时在JTextPane中可见.

我认为在done()方法中发生的任何事情都会发生在Event Dispatch Thread中.但显然JVM正在产生另一个线程来隐藏对话框并在填充JTextPane时执行println.我想保持显示进度对话框,直到GUI准备好再次接受用户输入...如何检测done()中的所有内容何时完成?

java swing multithreading swingworker event-dispatch-thread

1
推荐指数
1
解决办法
474
查看次数

如何在JFrame中运行2个线程

嗨我有以下问题...我有这样的主jframe开始:

public static void main (String args[]){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Form3 myF=new Form3();                    
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

在jframe我有Jpanels.在jpanel上我想开始第二个帖子.我试过这样的:

try {
    while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) {

        thread1.sleep(3*1000);
        System.out.println("+++++++++");
        System.out.println(DBAccess.haveResult("ASS"+harnessId));
        res = DBAccess.haveResult("ASS"+harnessId);

    }

} catch (InterruptedException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是我无法阻止那个线程,甚至无法取消它,因为主窗口停止反应

澄清我的问题:我在JPanel上有"测试"按钮,它正在启动测试过程.测试过程包括循环,每3秒重复一次,此循环检查数据库状态.问题是我无法停止此循环,直到状态出现在db(条件)中,因为我点击"test"后窗口很忙.即使实现runnable并将测试方法放入"run()"也无效.

testbutton源代码:

if (e.getActionCommand().equals("Test")){
            run();}
Run Code Online (Sandbox Code Playgroud)

运行方法:

@Override
    public final void run() {
        test();
    }
Run Code Online (Sandbox Code Playgroud)

测试方法:

Map result_row =  DBAccess.addRow("ASS"+harnessId,htOperList.get(seqNumber-1).getNametestprogram(),"",null);
                if(result_row.containsKey("ADDROW")){System.out.println("Record inserted" );}
                Database db = null;
                Map res = null;                
                try {
                    while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) …
Run Code Online (Sandbox Code Playgroud)

java concurrency swing event-dispatch-thread thread-sleep

1
推荐指数
1
解决办法
736
查看次数