2013-10-28 3 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 к 'х' или каждый элемент массива, который создает новый SwingImplementation с аргументами 1, а переменная «тт»

После этого JMenu gEleven получает JMenuItem в вопросе, я затем увеличивайте TT на 1.

Целью вышеуказанного кода является автоматизация процесса добавления JMenuItems в gEleven и ActionListeners к каждому элементу меню.

Проблема, аргумент, переданный для переменной 'tt', всегда один и тот же, 1, как если бы слушатель действия с аргументом для 'tt' из 1 применялся к каждому JMenuItem - почему это может быть и как можно использовать всевозрастающее TT создать одну ActionListener на JMenuItem, с аргументом (1, я) без тт всегда равно 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; 
    } 
} 
Смежные вопросы