请考虑以下代码片段:
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 如何编写动作监听器教程,我已经阅读了这个问题,但我仍有一些疑问:当我必须多次执行相同的动作时,我想知道哪种解决方案是最好的.
我想重用相同的ActionListener,但我不确定如何以最好的方式实现这一点(在代码可读性,代码可持续性,性能和代码风格方面).
首先是"标准"代码(如果我不打算重用动作监听器,我将使用它):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
Run Code Online (Sandbox Code Playgroud)
这样我就无法重用任何obv,因为它是一个匿名的内部类......
现在,我可以想到以下解决方案:
static final);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) 我有多个地方可以在一个坐标系和另一个坐标系之间进行转换.在每种情况下都有一个余弦/正弦计算,我们称之为x,y和x',y'.这些都是JFormattedTextFields.
如果用户在4中的任何一个中输入值,则调用ActionListener.让我们调用字段fieldx,fieldy,fieldx1和fieldy1.如果用户在fieldx或fieldy中输入任何内容,我将使用fieldx和fieldy中的当前值更新fieldx1和fieldy1的键盘和焦点侦听器(所有四个字段都是相同的).如果对侦听器的调用来自fieldx1或fieldy1,则会计算fieldx和fieldy.
然后我决定在配置文件中保存选择的字段(包括一堆复选框开/关和一些微调器的值)(开发后的新要求).我认为通过设置值和状态一切都会好的但是某些事情没有发生(幕后).我决定这部分是由于各种检查和输入等触发方法没有发生,因为当它们由一段代码设置时,字段没有触发键盘和焦点监听器.
在线阅读之后,我将所有的KeyboardAdapter更改为ActionListener,在我设置了值之后,我在上面提到的字段上调用了postActionEvent(),现在所有的后台内容都发生了(尽管顺序是一个问题,我将保存有关的额外信息)声明要正确更新.我做了这个改变是因为我认为解雇这么多假键盘事件会更加困难吗?
可能有更聪明/聪明的方法来做到这一点,但现在我试图不要触及太多的代码.
有没有人建议保存面板状态并刷新它(当前对象,面板)?
如果我继续这样做,有人可以建议一种方法来最小化ActionListener触发的时间吗?它似乎经常发射它是荒谬的!
我应该改变这里建议的事情吗?
您的类应该实现ActionListener还是使用匿名ActionListener类的对象
这似乎涉及更多的编码,但更精确的触发时...
如果这种问题/讨论在这里不合适,请告诉我:).只需输入此页面,我就会想到更多要阅读和尝试的内容.