在选定的条目上使用 ListCellRenderers
Using ListCellRenderers on selected entries
我正在使用 ListCellRenderer 来编辑 JList 中条目的外观。一旦它们被 selected(通过单击它们,此代码在单击事件中),我调用 ListCellRenderer 来更改文本的颜色。如果它们再次被 selected,我希望文本 return 变为正常颜色。我遇到的问题是,一旦我 select 第二个条目,第一个条目就会恢复正常颜色。我怎样才能让 selected 条目保持 selected 颜色,直到它们真正被 deselected?这是我实际调用函数的部分:
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 是一个包含每个 selected 条目文本的 ArrayList。
Once they are selected (by clicking them, this code is within a click event) I call the ListCellRenderer to change the color of the text
不,这不是它应该的工作方式,ListCellRenderer
将再次调用(由 JList
)并且 isSelected
参数将是 true
,以你会以不同的方式呈现这些值
ListCellRenderer
负责渲染整个状态,选中或未选中。
查看 Writing a Custom Cell Renderer 了解更多详情
例如
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
确实不是检测选择中更改的合适方法,如果用户使用键盘选择行会怎样?您应该改用 ListSelectionListener
(但不能纠正此问题)。
查看 How to Write a List Selection Listener and How to Use Lists 了解更多详情
我正在使用 ListCellRenderer 来编辑 JList 中条目的外观。一旦它们被 selected(通过单击它们,此代码在单击事件中),我调用 ListCellRenderer 来更改文本的颜色。如果它们再次被 selected,我希望文本 return 变为正常颜色。我遇到的问题是,一旦我 select 第二个条目,第一个条目就会恢复正常颜色。我怎样才能让 selected 条目保持 selected 颜色,直到它们真正被 deselected?这是我实际调用函数的部分:
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 是一个包含每个 selected 条目文本的 ArrayList。
Once they are selected (by clicking them, this code is within a click event) I call the ListCellRenderer to change the color of the text
不,这不是它应该的工作方式,ListCellRenderer
将再次调用(由 JList
)并且 isSelected
参数将是 true
,以你会以不同的方式呈现这些值
ListCellRenderer
负责渲染整个状态,选中或未选中。
查看 Writing a Custom Cell Renderer 了解更多详情
例如
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
确实不是检测选择中更改的合适方法,如果用户使用键盘选择行会怎样?您应该改用 ListSelectionListener
(但不能纠正此问题)。
查看 How to Write a List Selection Listener and How to Use Lists 了解更多详情