Swing Flackern und ausbrechen bei neuzeichnung

Snuke

Mitglied
Hallo liebe Gemeinde,
ich habe folgendes Problem. Ich habe eine JScrollPane mit einem JPanel in das Canvas gelegt werden.

Wenn ich nun mehr Canvas habe als das JPanel groß ist brechen diese beim Scrollen kurzzeititg aus (nach oben und unten) und alles flackert.

Hat jemand eine Idee wie ich das beheben kann? :)


lg


Java:
public class GUI extends JFrame
{
    JPanel p = null;
    JScrollPane scroll = null;

    public GUI(Server server)
    {
        setSize(1000, 800);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setLayout(null);

        
    
        p = new JPanel();
        p.setBackground(Color.WHITE);
        p.setLayout(new TreeLayout());
        p.setDoubleBuffered(true);
		
		
        scroll = new JScrollPane(localTree);
        scroll.setMaximumSize(new Dimension(400,500));
        scroll.setWheelScrollingEnabled(true);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scroll.setDoubleBuffered(true);
        scroll.setBackground(Color.WHITE);
        scroll.getVerticalScrollBar().setUnitIncrement(20);

        scroll.setBounds(5, 50, 400, 500);
        panel.add(scroll);
		
        add(panel);
		
        setVisible(true);


        int anchor = 1;

        TreeRender tr = null;
        
        tr = new TreeRender("A");
        p.add(""+anchor,tr);
        tr = new TreeRender("B");
        p.add(""+anchor,tr);
        tr = new TreeRender("C");
        p.add(""+anchor,tr);
        //usw. usw.
	
        p.validate();
        scroll.validate();
        scroll.getViewport().updateUI();
    }
}



public class TreeRender extends Canvas implements MouseListener
{
    static FontMetrics metrics;
    
    String name = "";

    public TreeRender(String name)
    {
        this.name = name;

        if(metrics == null)
        {
     	    metrics = getFontMetrics(new Font("Helvetica", Font.BOLD, 15));
        }
		
        addMouseListener(this);
    }

    public void paint(Graphics g)
    {
        g.setColor(new Color(0,0,0));
        setBackground(new Color(255,255,255));
        g.setFont(new Font("Helvetica", Font.BOLD, 15));
    		
        g.drawString(this.name, 20, metrics.getMaxAscent());
   }
	
    public Dimension getPreferredSize()
    {
        return new Dimension(350,metrics.getMaxAscent()+metrics.getMaxDescent());
    }
	
    public Dimension getMinumumSize()
    {
        return getPreferredSize();
    }
}

public class TreeLayout implements LayoutManager 
{
	protected Vector levels, comps;
	protected final static int DEFAULT_INDENT = 5;
	protected int indent;

	public TreeLayout() 
	{
		this(DEFAULT_INDENT);
	}

	public TreeLayout(int indent) 
	{
		levels = new Vector();
		comps = new Vector();
		setIndent(indent);
	}

	public void setIndent(int indent) 
	{
		this.indent = indent;
	}

	public int getIndent() 
	{
		return indent;
	}

	protected int getIndentFor(Component c) 
	{
		return ((Integer)levels.elementAt(comps.indexOf(c))).intValue()*getIndent();
	}

	public void addLayoutComponent(String level,Component comp) 
	{
		Integer i;
		try 
		{
			i = new Integer(level);
		}
		catch(NumberFormatException e) {throw new IllegalArgumentException("Illegal level");}
		levels.addElement(i);
		comps.addElement(comp);
	}

	public void removeLayoutComponent(Component comp) 
	{
		int i = comps.indexOf(comp);
		if (i != -1) 
		{
			levels.removeElementAt(i);
			comps.removeElementAt(i);
		}
	}

	public Dimension preferredLayoutSize(Container parent) 
	{
		return minimumLayoutSize(parent);
	}

	public Dimension minimumLayoutSize(Container parent) 
	{
		Component c;
		int indent;
		Dimension d = new Dimension();
		Dimension componentDim;

		for(int i=0; i < parent.getComponentCount(); i++) 
		{
			c = parent.getComponent(i);
			componentDim = c.getMinimumSize();
			indent = getIndentFor(c);
			d.width = Math.max(d.width, componentDim.width+indent);
			d.height += componentDim.height;
		}
		return d;
	}

	public void layoutContainer(Container parent) 
	{
		Component c;
		int y = 0;
		for(int i=0; i < parent.getComponentCount(); i++) 
		{
			c = parent.getComponent(i);
			c.setBounds(getIndentFor(c), y, c.getPreferredSize().width,c.getPreferredSize().height);
			y += c.getPreferredSize().height;
		}
	}
}
 

Marco13

Top Contributor
Nicht AWT (Canvas) und Swing (J...) mischen. Statt Canvas dort JPanel verwenden, und statt paint dort dann
Java:
@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    // ... was vorher in paint stand... aber am besten das setFont etc. auch rausziehen
}
überschreiben
 

Snuke

Mitglied
Danke für die Hilfe bisher :)... allerdings habe ich Canvas gewählt weil ich noch ein Icon reinsetze...


Java:
public void paint(Graphics g)
{
    paintIcon....
    g.drawString....
}


Ich dachte es ist nicht von bedeutung... Also habe ich das weggelassen. Den Rest probier ich schonmal aus.

lg
 

Snuke

Mitglied
Ich hab gerade gesehen das nun die Größe nicht mehr "richtig" Dynamisch rein kommt... Beim Auflisten des Windows Ordner geht es nurnoch bis Ordner/Datei P statt Z...


Weißt du da vllt. auch noch was?

lg
 
Zuletzt bearbeitet:

Snuke

Mitglied
Ja das mit dem Canvas hat sich schon geklärt :)... Das einzigste Problem ist noch die größe des JPanels

Das ganze sieht jetzt so aus (siehe Anhang). Es werden nicht mehr alle Dateien/Verzeichnisse bis zum ende aufgelistet.

lg
 

Anhänge

  • java.PNG
    java.PNG
    28,4 KB · Aufrufe: 34

Michael...

Top Contributor
Vermutlich berechnet Dein LayoutManager (oder was auch immer dafür verantwortlich ist) die PreferredSize des JPanels im JScrollPane falsch. Denn das ist die entscheidene Größe für das JScrollPane und den angebotenen Scrollbereich.
Bei der Darstellung würde sich die Verwendung von JList oder JTable anbieten. Diese benutzen echte Renderer und erstellen nicht für jede Zeile/ jeden Eintrag eine Komponente
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Flackern trotz DoubleBuffering AWT, Swing, JavaFX & SWT 8
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
K AWT flackern trotz buffering AWT, Swing, JavaFX & SWT 4
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
R Flackern beim JPanel-Übermalen AWT, Swing, JavaFX & SWT 9
P SWT SWT flackern beheben AWT, Swing, JavaFX & SWT 9
D Undecorated JFrame ohne Flackern resizen AWT, Swing, JavaFX & SWT 21
K Flackern trotz Double-Buffering AWT, Swing, JavaFX & SWT 10
sylo Flackern des Mauszeigers bei DND AWT, Swing, JavaFX & SWT 4
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
eQuest Swing Snake repaint() "flackern" AWT, Swing, JavaFX & SWT 13
J Flackern in JEditorPane() AWT, Swing, JavaFX & SWT 14
JRTHEFROG Auflösungsabhängiges Flackern von Bildschirmmasken AWT, Swing, JavaFX & SWT 3
B JFrame flackern durch setSize() AWT, Swing, JavaFX & SWT 8
N Flackern beim neuzeichnen von JPanel AWT, Swing, JavaFX & SWT 19
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
U Flackern verhindern AWT, Swing, JavaFX & SWT 5
J Flackern beim ersten laden von JPanel AWT, Swing, JavaFX & SWT 4
T Labels verschieben / Flackern AWT, Swing, JavaFX & SWT 2
M JToolTip und JPanel=>Neuzeichnung? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben