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.^^
 

frankred

Mitglied
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
 

Michael...

Top Contributor
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.
 

frankred

Mitglied
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.
 

Michael...

Top Contributor
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.
 

Michael...

Top Contributor
Nur so, weil wir erst kürzlich ein "Flacker" Problem hier hatten:
Du rufst nicht zufälligerweise irgendwo getGraphics() auf einer Komponente auf?
 

André Uhres

Top Contributor
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é
 

frankred

Mitglied
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
 

frankred

Mitglied
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:

André Uhres

Top Contributor
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é
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
K eigener button in swing AWT, Swing, JavaFX & SWT 3
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
S Eigener Syntax Highlighter - Problem AWT, Swing, JavaFX & SWT 5
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
N jComboBox und eigener Datentyp AWT, Swing, JavaFX & SWT 8
Q Eigener Colorchooser AWT, Swing, JavaFX & SWT 2
V LayoutManager Eigener LayoutManager funktioniert nicht. AWT, Swing, JavaFX & SWT 5
C Swing eigener InputDialog AWT, Swing, JavaFX & SWT 6
L Swing Falscher Wert nach eigener Sortierung (JTable) AWT, Swing, JavaFX & SWT 2
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
O Eigener Button AWT, Swing, JavaFX & SWT 8
data89 Eigener Button variiert in der Größe - Hilfee! AWT, Swing, JavaFX & SWT 5
A Nimbus eigener Painter funzt nicht AWT, Swing, JavaFX & SWT 11
O AWT Zeichne mit eigener Farbe AWT, Swing, JavaFX & SWT 3
A Aufrufen eigener Klasse AWT, Swing, JavaFX & SWT 8
J eigener Layoutmanager? AWT, Swing, JavaFX & SWT 6
M Eigenes ActionEvent / Eigener Listener AWT, Swing, JavaFX & SWT 2
G SWT DatePicker funzt nicht in eigener Anwendung AWT, Swing, JavaFX & SWT 5
J Problem mit eigener Titelleiste und MouseMotionListener AWT, Swing, JavaFX & SWT 2
F Eigener Observer? AWT, Swing, JavaFX & SWT 4
H eigener Editor und JList als PopMenu AWT, Swing, JavaFX & SWT 6
M Brauche Hilfe zum Einbinden von eigener Schrfitart AWT, Swing, JavaFX & SWT 3
m@nu Problem mit eigener TableCellEditor-Impelemtierung AWT, Swing, JavaFX & SWT 5
clemson Edtor mit anzeigen eigener Tags AWT, Swing, JavaFX & SWT 8
V SWT eigener Renderer? + wo gibts die Sourcen für SWT AWT, Swing, JavaFX & SWT 2
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
hdi Swing ListCellRenderer + JTextArea + LineWrap AWT, Swing, JavaFX & SWT 6
hdi Swing ListCellRenderer und LookAndFeel AWT, Swing, JavaFX & SWT 11
H Swing ListCellRenderer einer JList zeichnet sporadisch falsch AWT, Swing, JavaFX & SWT 6
K Swing Schrift in Kopfzeile von JComboBox über ListCellRenderer ändern AWT, Swing, JavaFX & SWT 2
H JFormatterTextField und JButton in JList (ListCellRenderer) AWT, Swing, JavaFX & SWT 2
N JList (JXList) ListCellRenderer zur Laufzeit ändern (Anzeigefehler) AWT, Swing, JavaFX & SWT 6
GilbertGrape Kleinigkeit beim ListCellRenderer AWT, Swing, JavaFX & SWT 2
A ListCellRenderer und JScrollPane AWT, Swing, JavaFX & SWT 4
Tom299 JList ListCellRenderer wird überschrieben AWT, Swing, JavaFX & SWT 8
J problem mit ListCellRenderer und in der zeile ein Jbutton AWT, Swing, JavaFX & SWT 5
A JTabbedPane JList Listcellrenderer AWT, Swing, JavaFX & SWT 5
R JList + ListCellRenderer AWT, Swing, JavaFX & SWT 1
D Swing JTable move Column dnd Idx1 --> Idx2 AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben