-1

JList一部のパネル階層で、キーUPとイベントを介して選択を変更できDOWNず、キーイベントを取得できないことに気付いたので、これらの行を追加して階層JListのフォーカス管理を調査し始めましたSwing:

mJList.addFocusListener(new FocusListener() {

    @Override
    public void focusLost(FocusEvent e) {
        System.out.println("focusLost to "+e.getOppositeComponent());
        //mJList.requestFocus();
    }

    @Override
    public void focusGained(FocusEvent e) {
        System.out.println("focusGained");
    }
});

最初に、いくつかのボタンがフォーカスを獲得してから数ミリ秒後にフォーカスを獲得していることに気づいたJListので、それらすべてのボタンをフォーカス不可にすると、この奇妙な結果が得られます。JListフォーカスが失われます... null ?!? !

focusGained
focusLost to null

次に、フォーカスが失われるたびにフォーカスを取り戻すために focusLost メソッドでコメントアウトされている行を追加しましたが、長期的には非常に悪い解決策だと思うので、私の質問は次のとおりです。

  1. なぜ私はJList一時的な焦点しか得られなかったのですか?そうでない場合、なぜそれをあきらめざるを得ないのnullですか?
  2. 適切な(グッドプラクティス)方法で修正するにはどうすればよいですか?
4

1 に答える 1

1

この SSCCE に関する問題を説明してください。それ以外の場合は、独自のものを投稿してください

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Testing extends JFrame {

    private static final long serialVersionUID = 1L;
    private DefaultListModel listModel = new DefaultListModel();
    private JList list = new JList(listModel);
    private JScrollPane sp = new JScrollPane(list);
    private JButton btn1 = new JButton("Reset Model with freeze");
    private JButton btn2 = new JButton("Reset Model with change selection");
    private int xX = 0;

    public Testing() {
        for (int x = 0; x < 19; x++) {
            listModel.addElement("" + x);
            xX++;
        }
        btn1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                listModel.removeAllElements();
                // caused locking GUI for long time in the case 
                // that Item count is more than 999 Items
                for (int x = 0; x < 19; x++) {
                    listModel.addElement("" + (x + xX));
                    xX++;
                }
            }
        });
        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                //list.clearSelection();
                if (list.getSelectedIndex() == 0) {
                    list.setSelectedIndex(1);
                }
                listModel.removeAllElements();
                for (int x = 0; x < 19; x++) {
                    listModel.addElement("" + (x + xX));
                    xX++;
                }
                list.setSelectedIndex(0);
            }
        });
        add(sp, BorderLayout.CENTER);
        add(btn1, BorderLayout.NORTH);
        add(btn2, BorderLayout.SOUTH);
        setLocation(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                list.setSelectedIndex(0);
            }
        });
        list.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                System.out.println("focusLost to " + e.getOppositeComponent());
                //mJList.requestFocus();
            }

            @Override
            public void focusGained(FocusEvent e) {
                System.out.println("focusGained");
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Testing().setVisible(true);
            }
        });
    }
}
于 2013-08-06T14:54:53.657 に答える