2013-10-28 25 views
0

我在一个更大的形式张贴了这个问题前面,并希望能在一个方式,让社会来帮助我更好地再重新发布,通过对您的所有倾倒的信息较少。ActionListener的失败 - Java进行,每个任务给的JMenuItem

从根本上说,我有这样的代码,解释如下:

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; 

首先,我循环通过所有的JMenuItem-S阵列中的chem3_x_y

然后,我添加一个ActionListener为 'X'或阵列,从而产生具有1的参数的新SwingImplementation的每个项目,并且变量“TT”

在此之后,JMenu的gEleven接收的JMenuItem中的问题,我然后增加1 TT。

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

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

+0

你的代码格式是非常糟糕使其很难为我们理解你的代码。我尽可能地修复了它。 –

+0

为了尽快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。我相信你已经被告知,并且使用更明智的属性名称。如果你忽略了我们的答案和建议,也许我们应该忽略你的问题。 –

+0

我怀疑你的问题在别处,你需要做一些调试。 –

回答

3

您的问题是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现场绑需要该值的监听器。

+0

好的猜测,没有'tt'的声明。 – trashgod

+1

它必须在包含该方法或某个父类或包含该类的类的类上,或者它必须是最终才能在内部类中可见的,在这种情况下,它永远不会增加。 –

2

编辑: 而不是 tt + 1,您可能的意思是 tt++ 。我从发布的代码中看不出来。也许,寻找一个tt该阴影预期的变量。在此基础上example,相应的代码下面使用++i。也可以考虑使用Action封装监听器。

image

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; 
    } 
} 
相关问题