Ich hab mir den November TechTip von Sun angesehen und den dort verwendeten Code in ein kleines Programm eingebaut, um zu sehen wie das alles so funktioniert.
CellRendererTest
GradientSelectionRenderer
StripeRenderer
Folgendes merkwürdiges verhalten:
Beim Ausführen des Programms CellRendererTest , ignoriert JList stripeList den gesetzten ListCellRender.
Wenn man nun aber den Code für die gradientList auskommentiert, funktioniert stripeList auf einmal.
JavaBug? Denkfehler? Gottes Wille!
lg materthron
CellRendererTest
Code:
package November06;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
public class CellRendererTest {
public static void main(String[] args) {
String[] items = new String[10];
//Create items
for(int i=0; i<items.length; i++) {
items[i] = "Item "+i;
}
///////////////////
// Stripe List
//////////////////
JList stripeList = new JList(items);
stripeList.setCellRenderer( new StripeRenderer() );
JScrollPane stripeListSP = new JScrollPane(stripeList);
//////////////////
// Gradient List
/////////////////
JList gradientList = new JList(items);
stripeList.setCellRenderer( new GradientSelectionRenderer() );
JScrollPane gradientListSP = new JScrollPane(gradientList);
JFrame frame = new JFrame("CellRendererTest");
frame.setLayout( new FlowLayout() );
frame.add(stripeListSP);
frame.add(gradientListSP);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
GradientSelectionRenderer
Code:
package November06;
import java.awt.Color;
import java.awt.Component;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;
class GradientSelectionRenderer extends DefaultListCellRenderer {
private boolean drawGradient = false;
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
drawGradient = false;
label.setOpaque(true);
if (isSelected) {
drawGradient = true;
label.setForeground(Color.WHITE);
label.setBackground(Color.BLUE);
label.setOpaque(false);
}
return label;
}
protected void paintComponent(Graphics g) {
if (drawGradient) {
Graphics2D gfx = (Graphics2D) g.create();
GradientPaint gradient = new GradientPaint(0, 0, Color.BLUE, 0, 10,
Color.BLACK);
gfx.setPaint(gradient);
gfx.fillRect(0, 0, getWidth(), getHeight());
gfx.dispose();
}
super.paintComponent(g);
}
}
StripeRenderer
Code:
package November06;
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;
class StripeRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
if (index % 2 == 0) {
label.setBackground(new Color(230,230,255));
}
return label;
}
}
Folgendes merkwürdiges verhalten:
Beim Ausführen des Programms CellRendererTest , ignoriert JList stripeList den gesetzten ListCellRender.
Wenn man nun aber den Code für die gradientList auskommentiert, funktioniert stripeList auf einmal.
JavaBug? Denkfehler? Gottes Wille!
lg materthron