Killkrog
Lt. Junior Grade
- Registriert
- Jan. 2006
- Beiträge
- 359
Hi liebe CB'ler!
Ich habe hier ein etwas vertracktes Problem und komme nun schon seit einiger Zeit zu keiner Lösung. Vielleicht kann mir einer von euch helfen.
Folgende Situation:
Ich habe eine stinknormale JList, die ich in ein JScrollPane gepackt habe.
Die JList hat außerdem einen eigenen CellListRenderer spendiert bekommen. Dieser gibt jeweils das Listenelement selbst zurück, um das Beispiel schlank und übersichtlich zu halten.
Auftretendes Symptom:
Wenn man die Pfeiltasten Hoch und Runter auf der Tastatur verwendet, um in der Liste nach oben oder unten zu navigieren, fängt er ja irgendwann unweigerlich automatisch das Scrollen an. Hierbei "flackern" sporadisch die ersten ein bis zwei Zellen jeweils an der Kante der jeweiligen Bewegungsrichtung. Das sieht ungefähr so aus wie der Effekt, den man bekommt, wenn man sich früher bei AWT nicht ums Double-Buffering gekümmert hat.
Frage:
Habt ihr die selben Symptome? (Vielleicht liegt es ja nur an meiner Maschine)
Habt ihr eine Lösung für das Problem?
Hier noch einmal der verwendete Code:
Example.java (beinhaltet main()-Methode)
MyListCell.java
MyListCellRenderer.java
Vielen Dank schon im Voraus für eure Hilfe und eine gute Nacht!
Killkrog
Ich habe hier ein etwas vertracktes Problem und komme nun schon seit einiger Zeit zu keiner Lösung. Vielleicht kann mir einer von euch helfen.
Folgende Situation:
Ich habe eine stinknormale JList, die ich in ein JScrollPane gepackt habe.
Die JList hat außerdem einen eigenen CellListRenderer spendiert bekommen. Dieser gibt jeweils das Listenelement selbst zurück, um das Beispiel schlank und übersichtlich zu halten.
Auftretendes Symptom:
Wenn man die Pfeiltasten Hoch und Runter auf der Tastatur verwendet, um in der Liste nach oben oder unten zu navigieren, fängt er ja irgendwann unweigerlich automatisch das Scrollen an. Hierbei "flackern" sporadisch die ersten ein bis zwei Zellen jeweils an der Kante der jeweiligen Bewegungsrichtung. Das sieht ungefähr so aus wie der Effekt, den man bekommt, wenn man sich früher bei AWT nicht ums Double-Buffering gekümmert hat.
Frage:
Habt ihr die selben Symptome? (Vielleicht liegt es ja nur an meiner Maschine)
Habt ihr eine Lösung für das Problem?
Hier noch einmal der verwendete Code:
Example.java (beinhaltet main()-Methode)
Code:
public class Example {
// ===================================================================
// {[> Initializers and Constructors
// =================================
public Example() {
MyListCell[] cells = new MyListCell[100];
for (int i = 0; i < cells.length; i++) {
cells[i] = new MyListCell();
}
JFrame frame = new JFrame("Flickering list");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
JList list = new JList(cells);
list.setCellRenderer(new MyListCellRenderer());
list.setVisibleRowCount(3);
JScrollPane sPane = new JScrollPane(list);
sPane.setViewportBorder(new EmptyBorder(2, 2, 2, 2));
frame.add(sPane);
frame.pack();
frame.setVisible(true);
}
// ===================================================================
// {[> Static Methods (Public)
// ===========================
public static void main(String[] args) {
new Example();
}
}
MyListCell.java
Code:
public class MyListCell extends Component {
// ===================================================================
// {[> Attributes
// ==============
private static final int prefWidth = 550, prefHeight = 75;
private static final Dimension prefSize = new Dimension(prefWidth, prefHeight);
private static final BufferedImage[] images = new BufferedImage[2];
private BufferedImage image;
// ===================================================================
// {[> Initializers and Constructors
// =================================
static {
images[0] = new BufferedImage(prefWidth, prefHeight, BufferedImage.TYPE_INT_RGB);
images[1] = new BufferedImage(prefWidth, prefHeight, BufferedImage.TYPE_INT_RGB);
fillBackgroundImage(images[0], new Color(202, 202, 202), new Color(94, 94, 94));
fillBackgroundImage(images[1], new Color(202, 114, 114), new Color(94, 53, 53));
}
// ===================================================================
// {[> Static Methods (Private)
// ============================
private static void fillBackgroundImage(BufferedImage img, Color c1, Color c2) {
Graphics2D g = img.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, prefWidth, prefHeight);
GradientPaint gp = new GradientPaint(0, 0, c1, 0, prefHeight - 1, c2);
g.setPaint(gp);
g.fillRect(2, 2, prefWidth - 4, prefHeight - 4);
g.setColor(Color.BLACK);
g.drawRect(2, 2, prefWidth - 5, prefHeight - 5);
g.dispose();
}
// ===================================================================
// {[> Methods (Public)
// ====================
public Dimension getPreferredSize() {
return prefSize;
}
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null);
}
public void setSelected(boolean selected) {
image = selected ? images[1] : images[0];
}
}
MyListCellRenderer.java
Code:
public class MyListCellRenderer implements ListCellRenderer {
// ===================================================================
// {[> Methods (Public)
// ====================
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
MyListCell cell = (MyListCell) value;
cell.setSelected(isSelected);
return cell;
}
}
Vielen Dank schon im Voraus für eure Hilfe und eine gute Nacht!
Killkrog