0

私はこの質問をもっと大きな形で以前に投稿しましたが、コミュニティが私をよりよく助けてくれるような方法で、あなた全員に関する情報を減らすことで、もう一度投稿したいと思っています.

基本的に、以下に説明するこのコードがあります。

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 を循環します。

次に、ActionListener を 'x' または配列の各項目に追加します。これにより、引数 1 と変数 'tt' を持つ新しい SwingImplementation が作成されます。

これに続いて、JMenu gElevenが問題の JMenuItem を受け取り、tt を 1 増やします。

上記のコードの目的は、JMenuItems を gEleven に追加し、ActionListeners を各メニュー項目に追加するプロセスを自動化することです。

問題は、変数 'tt' に渡される引数が常に同じ 1 であり、'tt' の引数が 1 のアクション リスナーがすべての JMenuItem に適用されているかのようです。 JMenuItemごとに 1 つの ActionListener を作成するためにttを常に増加させます。引数は (1, tt) で、tt は常に 1 ではありません。

4

2 に答える 2

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その値を必要とするリスナーに関連付けられたフィールドに結果を格納するようにします。

于 2013-10-28T02:10:05.493 に答える
2

編集済み:の代わりにtt + 1、おそらくtt++. 投稿されたコードからはわかりません。ttおそらく、意図した変数を隠しているa を探してください。このに基づいて、以下の対応するコードでは++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;
    }
}
于 2013-10-28T02:12:12.733 に答える