0

ListCellRenderer を使用して、JList 内のエントリの外観を編集しています。それらが選択されたら (クリックすることで、このコードはクリック イベント内にあります)、ListCellRenderer を呼び出してテキストの色を変更します。それらが再び選択された場合、テキストを通常の色に戻したいです。私が抱えている問題は、2 番目のエントリを選択すると、最初のエントリが通常の色に戻ることです。選択したエントリが実際に選択解除されるまで、選択した色を維持するにはどうすればよいですか? 実際に関数を呼び出すセクションは次のとおりです。

for(int i = 0; i < selectedEntries.size() - 1; i++){
    System.out.println("Inside the for loop at entry:" + i);
    if(selectedEntries.get(i).equals(selectedEntry)){
        selectedEntries.remove(i);
        removed = true;
        renderer.getListCellRendererComponent(logEntries, value, index, false, false);
        System.out.println("Duplicate Entry Removed From List");
    }
}

if(!removed){
    selectedEntries.add(selectedEntry);
    renderer.getListCellRendererComponent(logEntries, value, index, true, false);
}

解釈を簡単にするために、selectedEntries は、選択された各エントリのテキストを含む ArrayList です。

4

1 に答える 1

3

それらが選択されたら (クリックすることで、このコードはクリック イベント内にあります)、ListCellRenderer を呼び出してテキストの色を変更します。

いいえ、それはどのように機能するべきではありません. が( によって)ListCellRenderer再度呼び出され、パラメータが になります.これに対して、値を別の方法でレンダリングします.JListisSelectedtrue

ListCellRenderer、選択されているかどうかにかかわらず、状態全体のレンダリングを担当します。

詳細については、カスタム セル レンダラーの作成を参照してください。

例えば

ものリスト

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            DefaultListModel<String> model = new DefaultListModel<>();
            model.addElement("Apples");
            model.addElement("Bananas");
            model.addElement("Peachs");
            model.addElement("Pears");
            JList<String> listOfStrings = new JList<>(model);
            listOfStrings.setCellRenderer(new FancyPancyListCellRenderer());
            add(new JScrollPane(listOfStrings));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public static class FancyPancyListCellRenderer  extends DefaultListCellRenderer {

        protected static final Font SELECTED_FONT = new Font("Comic Sans MS", Font.PLAIN, 12);

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (isSelected) {
                setForeground(Color.YELLOW);
                setFont(SELECTED_FONT);
            } else {
                setFont(UIManager.getFont("Label.font"));
            }
            return this;

        }

    }

}

また、MouseListener選択の変更を検出する適切な手段ではありません。ユーザーがキーボードを使用して行を選択するとどうなりますか? 代わりにa を使用する必要がありますListSelectionListener(ただし、この問題を修正するためではありません)。

詳細については、リスト選択リスナーの作成方法とリストの使用方法を参照してください。

于 2015-07-07T03:03:30.197 に答える