Panelinhalt erscheint erst nach Mouseklick auf den Framerand

Status
Nicht offen für weitere Antworten.

Ande

Mitglied
Hi Leute,
ich hab ein ganz komisches Problem.

Bevor ich den Sourcecode poste möchte ich erstmal fragen ob ihr das auch schon mal gehabt habt, vielleicht weiss ja jemand was ich falsch mache:

Ich habe ein JFrame in dem ich ein Panel (mit weiteren Unterpanels in einer Reihe) von oben nach unten durchlaufen lasse (mit setLayout(null) und setBounds()). In diesem Thread wird nach einer geissen sleeptime das setbounds neu gesetzt und der panel verschiebt sich so nach unten.
Das Problem dabei ist nun: manchmal (ich würde sagen in 9 von 10 Fällen) seh ich den Panel durchlaufen, aber er hat keinen weiteren Inhalt. Klick ich nun mit der Mouse auf den Framerand wo dann der Mousezeiger zum vergrößern-Zeiger wird, erscheint plötzlich der Inhalt.
Wenn ich das ganze ohne Durchlaufeffekt mache (also einfach das Panel in den Frame lade siehe ich immer sofort den Inhalt.

Hat einer eine Ahnung was das sein könnte, hat jemand auch schonmal so ein Problem gehabt?

Falls das unklar sein sollte was ich meine kann ich auch gern den Sourcecode pasten..
Gruß
Ande
 

foobar

Top Contributor
Wenn du mit einem 2ten Thread auf Swing zugreifst, mußt du den mit dem EventDispatcherThread synchronisieren.
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)
 

Ande

Mitglied
Hmm habe mir jetz ein paar Tutorials dazu durchgelesen aber raffs immer noch nit. Hab versucht das invokeLater() einzubauen, aber hatte nicht den Effekt den ich haben wollte. Es is zum verrückt werden.

Ich poste mal den Code.

GUI ist n JFrame, ContentPanel, Wortklotz und Buchstabenklotz sind jeweils JPanels.
Das wichtige passiert in dem Gamethread. Da läuft ne whileschleife, die bei jedem Durchgang mit setBounds die Position des Woltklotzes verändert.
Was muss ich nun machen damit ich nicht immer auf den Framerand klicken muss?

Danke schonmal im Voraus :)


Code:
import java.awt.*;
import javax.swing.*;

public class GUI extends JFrame {
	
    ContentPanel contentPanel;
    
	public GUI() {
        setSize(new Dimension(800, 600));
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
		contentPanel = new ContentPanel(this);
                
        Gamethread gameThread = new Gamethread(contentPanel, "test123");
        Thread t = new Thread(gameThread);
        t.start();
        
        getContentPane().add(contentPanel);
	}
	
	
    public static void main(String[] args) {
        new GUI().setVisible(true);	
    }
}


Code:
import java.awt.*;
import javax.swing.*;


public class ContentPanel extends JPanel {

    public GUI gui;

    public ContentPanel(GUI gui) {
        this.gui = gui;
        setBackground(Color.BLACK);
        this.setLayout(null);
    }
}

Code:
import java.awt.*;
import javax.swing.*;


public class Wortklotz extends JPanel {
    
    public Wortklotz(String word) {
        for (int i = 0; i < word.length(); i++) {
            this.add(new Buchstabenklotz(word.substring(i, i+1).toUpperCase()));
        }
    }
}

Code:
import java.awt.*;
import javax.swing.JPanel;


public class Buchstabenklotz extends JPanel {

    private String buchstabe;
        
    public Buchstabenklotz(String buchstabe) {
        this.buchstabe = buchstabe;
        this.setPreferredSize(new Dimension(50,50));
    }
    
    public void paintComponent(Graphics g ) {
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, 49, 49);
        g.setColor(Color.WHITE);
        g.drawRect(0, 0, 49, 49);
        Font f = new Font("Serif", Font.BOLD, 40);
        g.setFont(f);
        int w = g.getFontMetrics().stringWidth(buchstabe);
        g.setColor(Color.BLACK);
        g.drawString(buchstabe, 25 - w/2, 40);
    }
}

Code:
public class Gamethread implements Runnable {

    private ContentPanel panel;
    private Wortklotz wortKlotz; 
    
    
    public Gamethread(ContentPanel panel, String wort) {
        this.panel = panel;
        wortKlotz = new Wortklotz(wort);
    }
    
    public void run() {
        int start = -50;
        int schritt = 20;

        panel.add(wortKlotz);
        
        while(true) {
            if (start > 520) {
                break;
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) { }

            wortKlotz.setBounds(0, start, (int)wortKlotz.getPreferredSize().getWidth(), (int)wortKlotz.getPreferredSize().getHeight());
            panel.repaint();
            start += schritt;
        }
    }
}
 

André Uhres

Top Contributor
Ande hat gesagt.:
..Es is zum verrückt werden..
Das was verrückt machen kann: invokeLater nützt überhaupt nix wenn wortKlotz.setBounds(..) nicht gesetzt ist :x
Code:
import javax.swing.*;
public class Gamethread implements Runnable { 
...
    public void run() { 
...
        panel.add(wortKlotz); 
        wortKlotz.setBounds(0, start, (int)wortKlotz.getPreferredSize().getWidth(), (int)wortKlotz.getPreferredSize().getHeight());
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                panel.revalidate();
            }
        });
...
    } 
}

Den "panel.repaint();" kannste dann rausnehmen.
 

Ande

Mitglied
Hmm hab mal versucht n Applet draus zu machen, aber im Eclipse Appletviewer hab ich dann wieder das selbe Problem mit der Anzeige. Geht erst nach klick auf den Framerand...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Panelinhalt im Programm verändern AWT, Swing, JavaFX & SWT 12
R Swing-Applet: Panelinhalt ändern AWT, Swing, JavaFX & SWT 3
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
stylegangsta Splash Screen erscheint nicht AWT, Swing, JavaFX & SWT 30
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
D Button erscheint nicht AWT, Swing, JavaFX & SWT 2
B Swing BalloonTip erscheint nicht in den ersten Zeilen einer JXTable AWT, Swing, JavaFX & SWT 4
A Swing JSlider erscheint doppelt AWT, Swing, JavaFX & SWT 2
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
L Swing JPanel erscheint erst beim Vergrößern AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Panel-Zeichnung erscheint nicht AWT, Swing, JavaFX & SWT 7
R Fensterinhalt erscheint erst, wenn das Fenster verändert wird AWT, Swing, JavaFX & SWT 7
A SWT SWT - Unbekannte Fläche (Objekt) erscheint im Composite AWT, Swing, JavaFX & SWT 6
BattleMaster246 JDialog erscheint in der Taskbar AWT, Swing, JavaFX & SWT 7
G Swing Die Menüleiste erscheint nicht AWT, Swing, JavaFX & SWT 8
M JScrollPane und JTree -> JScrollPane erscheint nicht AWT, Swing, JavaFX & SWT 6
W JDialog erscheint nur durchsichtig AWT, Swing, JavaFX & SWT 7
G JDialog erscheint nicht AWT, Swing, JavaFX & SWT 2
J Button erscheint (nicht) AWT, Swing, JavaFX & SWT 8
T Prozesse starten wenn JDialog erscheint AWT, Swing, JavaFX & SWT 2
F Häkchen erscheint nicht bei anklicken von Checkbox in JTable AWT, Swing, JavaFX & SWT 4
G Bild erscheint in Eclipse, aber nicht wenn Programm aus jar AWT, Swing, JavaFX & SWT 11
L Falsches Fenster erscheint im Vordergrund bei Taskwechsel AWT, Swing, JavaFX & SWT 3
T JMenu erscheint nicht richtig AWT, Swing, JavaFX & SWT 6
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
K Swing Buttons erst blinken lassen und dann abfragen, ob sie gedrückt worden sind AWT, Swing, JavaFX & SWT 2
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
U ToolTip Größenänderung, passt sich erst beim zweiten Mal an AWT, Swing, JavaFX & SWT 6
T Eingabefelder gefüllt erst dann Button klickbar AWT, Swing, JavaFX & SWT 6
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
M Anzeige updatet sich erst am Ende des Programms AWT, Swing, JavaFX & SWT 3
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
P ... zeichnet erst im zweiten Anlauf AWT, Swing, JavaFX & SWT 10
0 JFrame zeigt Inhalt erst nach vergrößern an AWT, Swing, JavaFX & SWT 3
G Components erscheinen erst bei Änderung des Frames AWT, Swing, JavaFX & SWT 3
xehpuk Swing Erst Components, dann Container zeichnen AWT, Swing, JavaFX & SWT 2
R JPanel wird erst neu gezeichnet nach erneuter auswahl AWT, Swing, JavaFX & SWT 8
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
M LayoutManager Erst layouten, dann zeichnen AWT, Swing, JavaFX & SWT 3
Z JPanel wird erst durch aufziehen des Fensters sichtbar AWT, Swing, JavaFX & SWT 3
F setIcon wird erst nach der methode ausgeführt AWT, Swing, JavaFX & SWT 4
T JTable erst nach Änderung der Spaltenbreite neu zeichnen AWT, Swing, JavaFX & SWT 10
T neuer JFrame öffnet sich erst wenn Methode die dahinerliegt abgeschlossen ist. BUG? AWT, Swing, JavaFX & SWT 4
I Swing Bild wird erst bei manueller Änderung der Fenstergrösse gezeichnet AWT, Swing, JavaFX & SWT 3
F Swing Button reagiert erst beim mehrmaligen Anklicken AWT, Swing, JavaFX & SWT 6
S Swing PopUp oeffnet sich nach der Methode, die erst nach Fensteraufruf gestartet wird AWT, Swing, JavaFX & SWT 3
R JButton -> erst sichtbar nach rollover AWT, Swing, JavaFX & SWT 9
F JButton reagiert erst beim 2 klick AWT, Swing, JavaFX & SWT 8
T JLabel.setText() funktioniert erst nach repaint() etc.? AWT, Swing, JavaFX & SWT 4
S JComboBox in JTable wird erst nach klick angezeigt AWT, Swing, JavaFX & SWT 2
N JFormattedTextField erst Verlassen, wenn Eingabe korrekt AWT, Swing, JavaFX & SWT 6
G Textarea zeigt Text erst am Schluss an AWT, Swing, JavaFX & SWT 2
T JButton wird erst bei mouseover sichtbar AWT, Swing, JavaFX & SWT 2
A Buttons erscheinen erst beim rüberfahren AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
Z Buttons erscheinen erst wenn man mit der Maus drüber geht AWT, Swing, JavaFX & SWT 7
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
X JTable "geht" erst beim 2.Klick AWT, Swing, JavaFX & SWT 2
G Tabelle aktualisiert sich erst, nachdem man auf sie klickt! AWT, Swing, JavaFX & SWT 4
P JTextArea erst nach Maximierung sichtbar AWT, Swing, JavaFX & SWT 3
T SWT - Inhalt einer Shell erst nach Größenänderung vorhanden AWT, Swing, JavaFX & SWT 5
B JPanel erst durch Button-Klick sichtbar machen AWT, Swing, JavaFX & SWT 8
M Java mit Swing - Elemente erst nach klick sichtbar AWT, Swing, JavaFX & SWT 13
C JPanel erst nach Button click anzeigen. AWT, Swing, JavaFX & SWT 11
B Fensterinhalt baut sich erst bei Größenveränderung auf AWT, Swing, JavaFX & SWT 3
T JSlider getValue() erst nach dem Loslassen des Mauszeigers AWT, Swing, JavaFX & SWT 3
M GUI mit Swing erst nach Maximieren richtige Anzeige AWT, Swing, JavaFX & SWT 2
M componenten im jframe erst nach fensterveränderung sichtbar AWT, Swing, JavaFX & SWT 2
J JTable Änderung erst beim Zeilenwechsel AWT, Swing, JavaFX & SWT 5
S [JTable] Editor erst nach Doppelklick AWT, Swing, JavaFX & SWT 5
S LaF - switcht erst während des Runs auf System.LaF AWT, Swing, JavaFX & SWT 2
N JPanel zeichnet Inhalt erst nach Größenänderung des JFrames AWT, Swing, JavaFX & SWT 3
M LookAndFeel? Erst beim 2.Mal Öffnen eines Menüs? AWT, Swing, JavaFX & SWT 3
M Panels werden erst beim max. oder min. des Fensters sichtbar AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben