【问题标题】:ActionListener Failure - Java For-Each Assignment to JMenuItemActionListener 失败 - Java For-Each 分配给 JMenuItem
【发布时间】:2013-11-06 16:48:48
【问题描述】:

我之前以更大的形式发布了这个问题,并希望以一种允许社区更好地帮助我的方式再次发布这个问题,减少关于你们所有人的信息。

基本上,我有这段代码,解释如下:

for(JMenuItem x : chem3_x_y){
  x.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent k) {
      new SwingImplementation(1, tt+1);
    }
  }); 
  gEleven[6].add(x);
  tt++;
}
tt=0;

首先,我循环遍历数组 chem3_x_y 中的所有 JMenuItem-s

然后,我将一个 ActionListener 添加到“x”或数组的每个项目,这将创建一个新的 SwingImplementation,其参数为 1,变量“tt”

在此之后,JMenu gEleven 接收到有问题的 JMenuItem,然后我将 tt 增加 1。

上述代码的目的是自动化将 JMenuItems 添加到 gEleven 和 ActionListeners 到每个菜单项的过程。

问题,为变量 'tt' 传递的参数始终相同,为 1,就好像将 'tt' 参数为 1 的动作侦听器应用于每个 JMenuItem - 为什么会这样,以及如何我使用不断增加的 tt 创建一个 ActionListener per JMenuItem,参数为 (1, tt) 而 tt 始终为 1

【问题讨论】:

  • 您的代码格式非常糟糕,我们很难理解您的代码。我已经尽力解决了。
  • 如需尽快获得更好的帮助,请发帖 SSCCE。我相信您已经被告知,以及使用更明智的属性名称。如果您无视我们的回答和建议,也许我们应该忽略您的问题。
  • 我怀疑您的问题出在其他地方,您需要进行一些调试。
  • @Andrew,我希望你不这样做 - 我已经尝试过制作其中之一,但是我的程序很大,如果不使其无法运行,我就无法删减很多内容,并且你是什​​么意思,我向你保证,我用合理的名字向你保证,我不再用数字来命名我的变量,还有什么可做的?
  • ?????我不知道你刚才问了什么。同样,我相信您发布的代码不会导致您的问题。我同意 Andrew 的观点,您必须付出一些努力来隔离您的错误。同样,如果您在此处发布代码供我们审查,请稍加努力以使其格式化。我们是志愿者,这当然对你要求不高。

标签: java arrays swing for-loop actionlistener


【解决方案1】:

您的问题是 tt 在调用侦听器之前不会递增。虽然您的动作侦听器代码是内联的,但事实上,它并非全部同步运行 - 直到调用动作侦听器才会调用 actionPerformed()。所以tt 在你循环时永远不会改变。

你想要的是这样的:

class MyListener implements ActionListener {
  private final int tt;

  MyListener (int tt) { 
    this.tt = tt;
  }

  public void actionPerformed(ActionEvent k) {
     new SwingImplementation(1, tt+1);
  }
}

for(JMenuItem x : chem3_x_y){
  x.addActionListener(new MyListener(tt++)); 
  gEleven[6].add(x);
}

这样您就可以递增 tt 并将结果存储在与需要该值的侦听器关联的 final 字段中。

【讨论】:

  • 猜对了,没有tt的声明。
  • 它必须在包含该方法或某个父级或包含该方法的类上,否则它必须是 final 才能在内部类中可见,在这种情况下它永远不会已增加。
【解决方案2】:

编辑:你可能指的是tt++,而不是tt + 1。我无法从发布的代码中看出。也许,寻找一个隐藏预期变量的tt。基于这个example,下面对应的代码使用++i。也可以考虑使用Action 来封装你的监听器。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;

/**
 * @see https://stackoverflow.com/a/19626219/230513
 * @see https://stackoverflow.com/questions/4038605
 */
public class FileMenu {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new FileMenu().create();
            }
        });
    }

    void create() {
        File userDir = new File(System.getProperty("user.dir"));
        File[] files = userDir.listFiles();

        JMenu menu = new JMenu("Recent Files");
        JToolBar toolBar = new JToolBar(JToolBar.VERTICAL);
        JLabel label = new JLabel(" ", JLabel.CENTER);
        int i = 0;
        for (File f : files) {
            if (f.isFile() && !f.isHidden()) {
                RecentFile rf = new RecentFile(f, label, ++i);
                menu.add(new JMenuItem(rf.getAction()));
                toolBar.add(rf);
            }
        }
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);

        JFrame f = new JFrame("FileMenu");
        f.setJMenuBar(menuBar);
        f.add(toolBar, BorderLayout.CENTER);
        f.add(label, BorderLayout.SOUTH);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

class RecentFile extends AbstractAction {

    private final File file;
    private final JLabel label;

    public RecentFile(final File file, final JLabel label, int i) {
        this.file = file;
        this.label = label;
        this.putValue(Action.NAME, String.valueOf(i) + " " + file.getName());
        this.putValue(Action.SHORT_DESCRIPTION, file.getAbsolutePath());
    }

    public void actionPerformed(ActionEvent e) {
        label.setText(file.getName());

    }

    public Action getAction() {
        return this;
    }
}

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多