Swing Eigener ListCellRenderer D'n'D "MOVE" - Mauszeiger flackert

frankred

Mitglied
Hallo zusammen,

habe ein Problem dass mich schon ziemlich lang plagt. Hab ne JList mit der ich über nen TransferHandler Sachen verschieben oder in ne andere JList ziehen kann. Erbt mein ListCellRenderer von DefaultListCellRenderer funktioniert alles einwandfrei. Ich will aber ein Panel mit mehreren Labels drinne anzeigen lassen und erbe desswegen von JPanel. Das klappt auch, jedoch flackert der Cursor jetzt nun beim Drag'n'Drop wie verrückt. Bzw. den Cursor sieht man nur das kleine Icon welches den "move" signalisiert flackert wild.

flackert nicht: public class MusicListCellRenderer extends DefaultListCellRenderer implements ListCellRenderer{
flackert: public class MusicListCellRenderer extends JPanel implements ListCellRenderer{


Hat jemand ne Lösung? Wäre echt toll.^^
 
Java:
package de.roth.jsona.view.jlist;

import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;

import de.roth.jsona.view.MainView;

public class MusicListCellRenderer extends JPanel implements ListCellRenderer{
	
	private static final long serialVersionUID = 6012215417747741907L;
	private Border margin;	
	private JLabel label;
	
	public MusicListCellRenderer(){
		setOpaque(true);
		margin = new EmptyBorder(0,3, 0, 0);
		label = new JLabel();
		this.add(label);

	}
	
	 public Component getListCellRendererComponent(
			 JList list,
	         Object value,
	         int index,
	         boolean isSelected,
	         boolean cellHasFocus){
		 setOpaque(true);
		 
		 MusicListItem item = ((MusicListItem) value);
		 label.setText(item.getText());
		 this.setBorder(margin);
		 
		 if(isSelected){
			 if(item.isActive()){
				 this.setBackground(MainView.colorManager.getActiveSelectedListBackground());
				 this.setForeground(MainView.colorManager.getActiveSelectedListForeground());
			 }else{
				 this.setBackground(MainView.colorManager.getSelectedListBackground());
				 this.setForeground(MainView.colorManager.getSelectedListForeground());
			 }
		 }else{
			 if(item.isActive()){
				 this.setBackground(MainView.colorManager.getActiveListBackground());
				 this.setForeground(MainView.colorManager.getActiveListForeground());
			 }else{
				 this.setBackground(MainView.colorManager.getListBackground());
				 this.setForeground(MainView.colorManager.getListForeground());
			 }
		 }
		 return this;
	 }
}

Glaub ich nich irgendwie. Hab ihn sonst auch immer so gemacht. Aber bisher noch nie mit D'nD mit Elementen
 
und mit diesem besteht das Flackern auch? Du sprachst ursprünglich von einem JPanel mit mehreren JLabels. Für diesen könnte man ja einfach von DefaultListCellRenderer erben.
Bis darauf, dass das setBorder (Zeile 38) im Konstruktor erfolgen könnte und das setOpaque (Zeile 34) bereits im Konstruktor gemacht wird, fällt mir da jetzt nichts aussergewöhnliches auf.
 
ja hier habe ich jetzt nur ein Label weil ich noch am rumprobieren war, brauch aber unbedingt mehrere, weil ich unterschiedliche Schriftwarten im FlowLayout darstellen muss, in jeweils einer Spalte. Ja stimmt, setOpaque kommt noch innen Konstruktor...
Weiß einfach nicht was ich noch ausprobieren soll, könnt vl auch möglicherweise ein BUG sein.
 
ja hier habe ich jetzt nur ein Label weil ich noch am rumprobieren war, brauch aber unbedingt mehrere
Deswegen meine Frage, ob das Flackern auch mit dem hier geposten CellRenderer auftritt.
Hilfreich wäre ein kurzes kombilierbares Beispiel, dass jeder hier per Copy&Paste bei sich ausführen kann, um das Problem auf dem eigenen System nachzustellen.
 
Nur so, weil wir erst kürzlich ein "Flacker" Problem hier hatten:
Du rufst nicht zufälligerweise irgendwo getGraphics() auf einer Komponente auf?
 
Hallo Frank,

versuch mal folgenden Code in deine Klasse MusicListCellRenderer zu kopieren:
Java:
public void validate() {}
public void invalidate() {}
public void repaint() {}
public void revalidate() {}
public void repaint(long tm, int x, int y, int width, int height) {}
public void repaint(Rectangle r) {}

Gruß,
André
 
hey hammer das funktioniert! du bist der BESTE! Nach soviel Stunden grübeln endlich die Lösung. Der Mousecursor bleibt da und flackert nicht. Vielen Dank!

Liebe Grüße Frank
 
Noch nen Nachtrag: kann es sein dass die Zeichnung vom Panel jetzt total verbuggt ist? Normal müsste sich das Panel doch auf die ganze breite ausrichten, ich will ja eigentlich keine absoluten werte angeben müssen, kann ja sein dass jemand das Fenster vergrößert. Auch die Zellenhöhe soll sich ja dem JLabel anpassen, und das JLabel der Schriftgröße... komme nicht klar so..., die Formatierung scheint nicht wirklich zu funktionieren so... Wenn ich die Methoden rauslösche funktioniert die Formatierung (Labelpositionierung im Panel usw...) so wie ich es will...
 
Zuletzt bearbeitet:
Wir können natürlich auch gezielt die Validierung wieder aktivieren, etwa so:
Java:
    private boolean changed;
    public void validate() {
        if (changed) {
            changed = false;
            super.validate();
        }
    }
    public void invalidate() {
        if (changed) {
            super.invalidate();
        }
    }
    public void firePropertyChange(String propertyName, int oldValue, int newValue) {
        if ("changed".equals(propertyName)) {
            changed = true;
        }
    }
...
        final JList list = new JList(listModel);
        final MusicListCellRenderer renderer = new MusicListCellRenderer();
        list.setCellRenderer(renderer);
        list.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                renderer.firePropertyChange("changed", 0, 1);
            }
        });
Gruß,
André
 

Neue Themen


Zurück
Oben