相关疑难解决方法(0)

等待多个SwingWorkers

请考虑以下代码片段:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;

public class TestApplet extends JApplet
{
    @Override
    public void init()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                @Override
                public void run()
                {
                    createGUI();
                }
            });
        }
        catch(InterruptedException | InvocationTargetException ex)
        {
        }
    }

    private void createGUI()
    {
        getContentPane().setLayout(new FlowLayout());
        JButton startButton = new JButton("Do work");
        startButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                JLabel label = new JLabel();
                new Worker(label).execute();
            }
        });
        getContentPane().add(startButton);
    }

    private class Worker extends SwingWorker<Void, …
Run Code Online (Sandbox Code Playgroud)

java swing multithreading swingworker wait

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

ActionListener最佳实践


抱歉标题,可能太通用了.

我已经阅读了Java 如何编写动作监听器教程,我已经阅读了这个问题,但我仍有一些疑问:当我必须多次执行相同的动作时,我想知道哪种解决方案是最好的.

我想重用相同的ActionListener,但我不确定如何以最好的方式实现这一点(在代码可读性,代码可持续性,性能和代码风格方面).

首先是"标准"代码(如果我不打算重用动作监听器,我将使用它):

btnMenu.addActionListener(
    new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Navigator.showMenu();
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

这样我就无法重用任何obv,因为它是一个匿名的内部类......

现在,我可以想到以下解决方案:

  1. 在字段中存储匿名内部类的引用(很可能是static final);
  2. 编写一个实现ActionListener接口的新类.

解决方案1的示例代码:

public static final MENU_ACTION_LISTENER = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Navigator.showMenu();
    }
};

btnMenu.addActionListener(MENU_ACTION_LISTENER);
Run Code Online (Sandbox Code Playgroud)

解决方案2的示例代码:

// package-private, only GUI-package classes should be able to use it.
// most likely I won't ever need to subclass it, so why not making it final?
final class …
Run Code Online (Sandbox Code Playgroud)

java swing package actionlistener

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

ActionListeners,多个字段更新以及从文件重新加载用户GUI选择

我有多个地方可以在一个坐标系和另一个坐标系之间进行转换.在每种情况下都有一个余弦/正弦计算,我们称之为x,y和x',y'.这些都是JFormattedTextFields.

如果用户在4中的任何一个中输入值,则调用ActionListener.让我们调用字段fieldx,fieldy,fieldx1和fieldy1.如果用户在fieldx或fieldy中输入任何内容,我将使用fieldx和fieldy中的当前值更新fieldx1和fieldy1的键盘和焦点侦听器(所有四个字段都是相同的).如果对侦听器的调用来自fieldx1或fieldy1,则会计算fieldx和fieldy.

然后我决定在配置文件中保存选择的字段(包括一堆复选框开/关和一些微调器的值)(开发后的新要求).我认为通过设置值和状态一切都会好的但是某些事情没有发生(幕后).我决定这部分是由于各种检查和输入等触发方法没有发生,因为当它们由一段代码设置时,字段没有触发键盘和焦点监听器.

在线阅读之后,我将所有的KeyboardAdapter更改为ActionListener,在我设置了值之后,我在上面提到的字段上调用了postActionEvent(),现在所有的后台内容都发生了(尽管顺序是一个问题,我将保存有关的额外信息)声明要正确更新.我做了这个改变是因为我认为解雇这么多假键盘事件会更加困难吗?

可能有更聪明/聪明的方法来做到这一点,但现在我试图不要触及太多的代码.

  1. 有没有人建议保存面板状态并刷新它(当前对象,面板)?

  2. 如果我继续这样做,有人可以建议一种方法来最小化ActionListener触发的时间吗?它似乎经常发射它是荒谬的!

我应该改变这里建议的事情吗?

您的类应该实现ActionListener还是使用匿名ActionListener类的对象

这似乎涉及更多的编码,但更精确的触发时...

如果这种问题/讨论在这里不合适,请告诉我:).只需输入此页面,我就会想到更多要阅读和尝试的内容.

java swing awt auto-update jformattedtextfield

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