[英]Multiple ListCellRenderer
Is it possible to have multiple ListCellRenderer's implementation in a single class? 是否可以在一个类中使用多个ListCellRenderer?
Actually I have multiple JList's in my application and I would I am in need of different ListCellRenderer's for each. 实际上我的应用程序中有多个JList,我需要为每个JList需要不同的ListCellRenderer。
Can I have different class names for Implementing ListCellRenderer's Component method. 我可以为实现ListCellRenderer的Component方法使用不同的类名。
For ex: If I have a class with name "MultiColumnCellRenderer" with some implementation of Component method and another class with name "MultiColumnCellRenderer2" with some other implementation of Component method? 例如:如果我有一个名为“MultiColumnCellRenderer”的类,其中包含一些Component方法的实现,另一个名为“MultiColumnCellRenderer2”的类,以及其他一些Component方法的实现?
public class MultiColumnCellRenderer extends JPanel implements
ListCellRenderer {
public MultiColumnCellRenderer() {
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Some implementation of Component Method
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}
public class MultiColumnCellRenderer2 extends JPanel implements
ListCellRenderer {
public MultiColumnCellRenderer2() {
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Some implementation of Component Method
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}`
And if I do something like: 如果我做了类似的事情:
list1.setCellRenderer(new MultiColumnCellRenderer());
list2.setCellRenderer(new MultiColumnCellRenderer2());
Its not working out.... 它没有工作....
I am looking for different rendering for both list1 and list2. 我正在为list1和list2寻找不同的渲染。
How can I achieve this 我怎样才能做到这一点
Is it possible to have multiple ListCellRenderer's implementation in a single class? 是否可以在一个类中使用多个ListCellRenderer?
If by 'have' you mean 'use' and if by 'class' you mean 'GUI', then yes. 如果用'have'表示'使用',如果用'class'表示'GUI',那么是的。
Here is an example: 这是一个例子:
import java.awt.*;
import javax.swing.*;
class MultiColumnCellRendererTest {
public static void main(String[] args) {
final String[] fruits = {
"Apple",
"Pear",
"Banana",
"Grapefruit"
};
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JList fruitList1 = new JList(fruits);
fruitList1.setCellRenderer(new MultiColumnCellRenderer());
JList fruitList2 = new JList(fruits);
fruitList2.setCellRenderer(new MultiColumnCellRenderer2());
JPanel gui = new JPanel(new GridLayout(1,0,2,2));
gui.add(fruitList1);
gui.add(fruitList2);
JOptionPane.showMessageDialog(null, gui);
}
});
}
}
class MultiColumnCellRenderer extends JPanel implements
ListCellRenderer {
JLabel label;
public MultiColumnCellRenderer() {
setBackground(Color.RED);
label = new JLabel();
add(label);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
label.setText(value.toString());
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}
class MultiColumnCellRenderer2 extends JPanel implements
ListCellRenderer {
JLabel label;
public MultiColumnCellRenderer2() {
setBackground(Color.GREEN);
label = new JLabel();
add(label);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
label.setText(value.toString());
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}
Here's an SSCCE that works - maybe you can figure out how this is different from your own code. 这是一个有效的SSCCE - 也许你可以弄清楚这与你自己的代码有什么不同。
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
public class TwoLists {
private static void list(ListCellRenderer renderer, Object... elements) {
DefaultListModel model = new DefaultListModel();
for(Object element : elements) {
model.addElement(element);
}
JList list = new JList(model);
list.setCellRenderer(renderer);
JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(list));
frame.setSize(200, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
list(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setBackground(Color.RED);
return c;
}
}, "One", "Two", "Three");
list(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setBackground(Color.BLUE);
return c;
}
}, "North", "South", "EAST");
}
}
It's also possible to arrange for a single ListCellRenderer
implementation to manage a specified Color
. 也可以安排单个ListCellRenderer
实现来管理指定的Color
。 In the variation below, a darker()
color is used to signify selection. 在下面的变体中, darker()
颜色用于表示选择。
import java.awt.*;
import javax.swing.*;
/** @see http://stackoverflow.com/questions/8987285 */
class MultiColumnCellRendererTest {
private static final String[] fruits = {
"Apple", "Pear", "Banana", "Grapefruit"
};
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new GridLayout(1, 0, 2, 2));
gui.add(createList(Color.red));
gui.add(createList(Color.green));
JOptionPane.showMessageDialog(null, gui);
}
});
}
private static JList createList(Color color) {
JList list = new JList(fruits);
list.setCellRenderer(new ColorCellRenderer(color));
return list;
}
private static class ColorCellRenderer extends JLabel implements ListCellRenderer {
private Color background;
private Color selected;
public ColorCellRenderer(Color background) {
this.setOpaque(true);
this.background = background;
this.selected = background.darker();
this.setBackground(background);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
setBackground(isSelected ? selected : background);
return this;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.