标签: event-dispatch-thread

添加JFrame事件处理程序之前的滞后?

我正在开发一个简单的Java swing项目.这是主类的代码(名称已更改):

public class MainProg
{
    private static MainProg program; 

    //mainWin is a JFrame
    private MainWindow mainWin;

    //Event handler class which extends MouseAdapter
    private TrayManager trayMgr;


    public static void main(String[] args)
    {                
        program = new MainProg();
    }

    public MainProg()
    {
        mainWin = new MainWindow();
        trayMgr = new TrayManager();

        mainWin.startBtn.addMouseListener(trayMgr);

        mainWin.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,当程序启动时,main()它会创建一个新的MainProg类实例,然后调用构造函数.在构造函数中,它创建JFrame的新实例mainWin.然后它将事件处理程序附加到按钮上mainWin.

在事件处理程序类中trayMgr,唯一的方法是mouseClicked()除了a之外什么都不做System.out.println('Clicked');

问题是,当我在Netbeans中运行此程序时,JFrame立即显示,但我似乎必须在控制台中打印消息之前单击按钮2-3次.

这只是Netbeans的特定内容,还是我必须更改某些内容才能在窗口可见之前设置事件处理程序?

java concurrency swing netbeans event-dispatch-thread

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

wait()和sleep()的问题?

可能重复:
java中的GUI线程

我一直在尝试创建一个基于文本的游戏,它到目前为止,除了使用Thread.sleep()和wait()时这个奇怪的错误这个代码应该通过char打印消息char到一个名为console的JTextArea延迟每一个之间.

这是带wait()的代码

int i=0;
synchronized(mon) {
    while(i<msg.length())
    {
        console.setText(console.getText()+ msg.charAt(i));
        i++;
        try {
            mon.wait(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是带sleep()的代码:

int i=0;
    while(i<msg.length())
    {
        console.setText(console.getText()+ msg.charAt(i));
        i++;
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,当它到达此代码时,程序等待msg.length*500ms然后立即打印整个msg!救命!

java swing multithreading event-dispatch-thread

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

我可以运行两个EDT吗?

这主要是一个理论问题。下面的示例使我想到了它,但这可能不是最好的示例。请假设以下原因是具体的,暂时无法解决。

我正在运行的程序具有一个可选的调试框架,该框架在程序启动时创建,并且可以通过用户按按钮/键盘快捷方式使其可见。

我的问题是,由于我在EDT上的进程很长,如果它由于某种原因挂起或失败,我想立即查看,而不是等待该线程结束运行,以更新调试日志框架。

我的解决方案是让两个单独的GUI具有两个单独的EDT,并由一个单独的线程更新它们。

这可能吗,还是我做不到?我尚未找到任何可以向我展示如何使用的在线资源。我知道EDT应该是单线程的,但是如果我使线程不纠缠,我可以有两个吗?请?

java user-interface event-dispatch-thread

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

如何停止重绘()闪烁

我正在尝试为java创建一个程序,我有闪烁的常见问题.我尝试过很多东西要消除,但都是一样的.而我画的椭圆正在移动japplet是闪烁的.我需要你的帮助来解决这个问题.这是我的代码:

import java.awt.Color;

public class all extends JApplet implements Runnable {

    double x=0;
    double y=0;
    int m=0;
    int n=0;
    int f=30;
    int ?=0;
    Thread kinisi;
    JPanel panel;
    JFrame frame;
    private boolean running = false;
    private JTextField textField1;
    private JTextField textField2;
    Image backGround;
    JPanel panel_3;
    Image bf = createImage(m, n);
    private Graphics doubleg;
    private Image i;

    public void init() {
        this.setSize(800, 700);
    }

    public all() {
        getContentPane().setLayout(null);

        JButton btnNewButton = new JButton("Start");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) { 
                String …
Run Code Online (Sandbox Code Playgroud)

java swing paint event-dispatch-thread japplet

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

关于Swing GUI中的线程

我想确保我明白一些事情.请确认这是否属实.

一个我声明一个线程,并在其中运行一些东西 - 从那一点开始的一切都将在该线程内运行,除非我明确地创建一个新线程.无论代码通过多少个类和方法 - 它都将保留在同一个线程中.

例如,假设我有一个完全在一个自定义JFrame内运行的应用程序.如果我希望整个应用程序在同一个线程内运行,我可以通过创建一个新线程,并在该线程的run()方法中实例化新的JFrame来实现.

这实际上是否会确保整个应用程序将在创建JFrame的线程内运行,除非我显式创建一个新线程并在该新线程内运行某些东西?

这是一个普遍的问题,但让我先谈谈Swing:

如果我希望整个Swing应用程序在EDT内运行(如果我错了请纠正我 - 正是我大部分时间都需要使用Swing),SwingUtilities.invokeLater()main方法中使用一次就足够了,如下所示:

public static void main(String[]args){
    SwingUtilities.invokeLater( new Runnable(){
         JFrame frame = new CustomJFrame(); // where the entire application runs.
    } );
}
Run Code Online (Sandbox Code Playgroud)

java swing multithreading event-dispatch-thread

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

JTable - UI在许多插入时冻结

我有一个GUI应用程序,它有几个选项卡,每个选项卡都有一个JTable.我的UI类i在以下代码中处理来自Controller的事件,该代码在EDT上运行:

private void processAnalysisResult(AnalysisResult generatedValue) {
    LimitType limit = generatedValue.getMetric().getLimit();
    String limitName = limit.getName();
    int index = tabs.indexOfTab(limitName);
    Component component = tabs.getComponentAt(index);
    JScrollPane scrollPane = (JScrollPane) component;
    JTable table = (JTable) scrollPane.getViewport().getView();
    AnalysisResultTableModel model = (AnalysisResultTableModel) table.getModel();
    model.addRow(generatedValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

每秒有几千个新生成的结果,atm我把它降低到大约10k.即使使用相对较低的值,应用程序也会冻结大约10-20秒,从Jtable处理UI更新.插入每一行时,该addRow方法调用fireTableRowsInsertedmewthod,但这可能是那么慢吗?

编辑:这是处理事件的代码(从后台处理线程异步调用):

  controller.addAnalysisGenerationListener(new GeneratedValueListener<AnalysisResult>() {
        @Override
        public void valueGenerated(final GeneratedValueEvent<AnalysisResult> event) {
            processEDT(new Runnable() {
                @Override
                public void run() {
                    processAnalysisResult(event.getGeneratedValue());
                }
            });
        }
    });


private void processEDT(Runnable runnable) {
    if (EventQueue.isDispatchThread()) {
        runnable.run(); …
Run Code Online (Sandbox Code Playgroud)

java concurrency swing jtable event-dispatch-thread

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

EDT摆动问题

我有一个在EDT内执行的方法.它是这样的:

myMethod()
{
  System.out.prinln(SwingUtilities.isEventDispatchThread());

  for (int i = 0; i < 10; i++)
  {
   Thread.sleep(3000);
   someJPanel.remove(otherJPanel);
  }
}
Run Code Online (Sandbox Code Playgroud)

我期望发生的事情:十个JPanels将逐一从他们的父母中删除,每次删除之间有三秒钟暂停...

实际发生了什么:在所有10个元素一次被移除之后,一切都冻结了30秒.

控制台中的行始终为true(SwingUtilities.isEventDispatchThread()).

由于我在EDT中做了这一切,为什么瞬间变化呢?为什么它等待方法首先达到它的结束?

我应该如何改变我的代码以实现删除之间的三秒延迟?

java swing event-dispatch-thread

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

Java程序"很快冻结"

我是java的新手,它不是我的第一个编程语言.我实际上尝试编写下载所有文件的下载程序,直到服务器上的版本与客户端版本相同.

该计划运行良好,但这是我无法解决的问题.

如果我运行此代码:

private void updateContent()
{
    DownloadButton.setEnabled(false);
    SaveLocationButton.setEnabled(false);
    UpdateText.setText("Update to Version " + ServerVersionNumber + "...");
    UpdateText.setForeground(new Color(200, 150, 0, 255));
    ProgressText.setText("(1/2) Files will be downloaded");
    ProgressText.setForeground(new Color(200, 150, 0, 255));
    LoadingBar.setStringPainted(true);

    for(int i = 1; i < (ServerVersionNumber - LocalVersionNumber + 1); i++)
    {
        int CurrentUpdateFile = LocalVersionNumber + i;


        try 
        {
            URL FileURL = new URL(Host + CurrentUpdateFile + ".zip");

            try {
                FileURL.openConnection();


                InputStream reader = FileURL.openStream();
                FileOutputStream writer = new FileOutputStream(ContentSaveDirectory + CurrentUpdateFile + ".zip");

                byte[] …
Run Code Online (Sandbox Code Playgroud)

java swing event-dispatch-thread

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

计算时Java Swing重绘:动画排序算法

http://www.youtube.com/watch?v=M0cNsmjK33E

我想使用Java Swing开发类似于以上链接的内容。我有排序方法,并且在重绘时做了,但是当我触发排序时,没有显示条形图对其进行缓慢排序,而是冻结并随后在数组完全排序后解冻。

我该如何解决?编辑:对不起,忘记了代码。它是一个非常简单的GUI。另一个用于排序的类对整个数组进行排序

public class SortGUI {
JFrame frame;
int frameWidth = 1000, frameHeight = 1000;
int panelWidth, panelHeight;
DrawPanel panel;
JPanel panel2;
JScrollPane scroll;
JViewport view;

static int[] S = new int[50000];

public static void main(String[] args) throws InterruptedException {
    SortGUI app = new SortGUI();
    initializeArray();        
    app.go(); 
}

public static void initializeArray()
{
         for (int i = 0; i < S.length; i++) {
     S[i] = (int) (Math.random() * 16581375);
     }
}

public void go() throws InterruptedException {
    //Frame …
Run Code Online (Sandbox Code Playgroud)

java sorting animation swing event-dispatch-thread

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

Java Swing JFrame为游戏推出了另一个JFrame

我正在使用Java开发一个小游戏.我的应用程序有一个主JFrame,可以通过单击JButton创建另一个Window(游戏窗口).我已经单独测试了我的游戏窗口,一切都很好.

这是我的游戏窗口构造函数:

public GameWindow(final GameController controller)
{
    super("Boulder Dash Game");

    this.controller = controller;
    this.controller.registerObserver(getCurrentFrame()); 
    this.gamePanel = new GamePanel(controller);

    this.frameWidth = controller.getColumns() * 16;
    this.frameHeight = controller.getRows() * 16 + 76;

    getContentPane().add(gamePanel, BorderLayout.CENTER);

    setSize(frameWidth, frameHeight);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    controller.startGame();
}
Run Code Online (Sandbox Code Playgroud)

controller.startGame()方法启动游戏循环.当我直接从我的主要开始这个窗口时,游戏循环工作正常.

现在,我想从我的主框架启动这个GameWindow框架.这是我的主框架中的代码:

playButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(final @Nullable ActionEvent e)
    {
        String selectedItem = (String) levelsComboBox.getSelectedItem();
        assert selectedItem != null;
        controller.lauchGame(selectedItem);
    }
});
Run Code Online (Sandbox Code Playgroud)

controller.launchGame(String selectedItem)是一种用于加载游戏关卡并启动游戏窗口的方法.这是代码

public void lauchGame(final String levelQueried)
{
    assert levelQueried != null;
    Level level = LevelRepository.load(levelQueried); …
Run Code Online (Sandbox Code Playgroud)

java swing event-dispatch-thread

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