# JFrame neu zeichnen



## Gast LA (8. Jul 2004)

Ich bin ziemlicher Java-Anfänger und habe folgendes Prob.:
Ich möchte das GUI quasi refreschen, also neu zeichnen. Irgendwie habe ich dabei ein grundsätzliches Verständnisproblem.
Hier der (gekürzte) Code:


```
public class MSC_Main extends JFrame implements ActionListener { //blablabla 

public MSC_Main() { //constructor
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);}}); //blablabla
        }

public static void main(String[] args) {
        setDefaultLookAndFeelDecorated(true); //Java Look and Feel
        MSC_Main frame = new MSC_Main();

        frame.setSize(500, 600);
        frame.setResizable(false);            //Größe nicht änderbar
        frame.setLocationRelativeTo(null);    //Frame auf Bildschrim zentrieren
        frame.setTitle("Test");
        frame.setVisible(true);
    }
private void irgendwas() {
        //blablabla
    }
}
```

Jetzt kommts: Wenn ich nun z.B. mit frame.repaint(); das GUI neu zeichnen möchte, kann ich nicht darauf zugreifen.
Woran liegts? Wer kann helfen?

THX im voraus.


----------



## Beni (8. Jul 2004)

Wo willst du denn "frame.repaint" aufrufen? Oder suchst Du sowas, wie im Code unten?


```
public class MSC_Main extends JFrame implements ActionListener { //blablabla 

public MSC_Main() { //constructor
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);}}); //blablabla
        }

public static void main(String[] args) {
        setDefaultLookAndFeelDecorated(true); //Java Look and Feel
        MSC_Main frame = new MSC_Main();

        frame.setSize(500, 600);
        frame.setResizable(false);            //Größe nicht änderbar
        frame.setLocationRelativeTo(null);    //Frame auf Bildschrim zentrieren
        frame.setTitle("Test");
        frame.setVisible(true);
    }
private void irgendwas() {
        //blablabla
        repaint(); // ##### sowas?
    }
}
```


----------



## Gast LA (8. Jul 2004)

Es geht darum, dass mit dem FileChooser eine Datei gewählt und anschliessend in ein TextPanel geladen wird. Da das Laden u. U. etwas dauert (Konvertierung des Inhalts ...), passiert folgendes: Der Dialog verschwindet, wenn er jedoch über dem GUI lag, entsteht an dieser Stelle quasi ein "leerer grauer Fleck". Daher dachte ich es wäre eine gute Idee, das GUI neu zu zeichnen und danach die Datei in das Panel zu laden. Sähe halt besser aus.
Deinen Tip habe ich ausprobiert; bringt nicht den gewünschten Erfolg. Ach ja, bezieht sich in diesem Fall repaint automatisch auf den Frame??


----------



## Beni (8. Jul 2004)

Ach so, das Problem ist also, dass dieses laden zuviel Zeit benötigt. Wahrscheinlich rufst du das Laden aus einem "actionPerformed" auf?


```
public void actionPerformed( ActionEvent e ){
  if( [User hat Datei gewählt] ){
    sehrLangesLaden( file );
  }
}
```


Dann musst du ein bisschen Multithreading einsetzen:

```
public void actionPerformed( ActionEvent e ){
  if( [User hat Datei gewählt] ){
    new Thread(){
      public void run(){
       sehrLangesLaden( file );
     }
    }.start();
  }
}
```
Denn so kann der Thread, der den Dialog aufgerufen hat (und der gleichzeitig für das Zeichnen zuständig ist), weiterarbeiten.

Und die nächste Frage "wie mach ich einen Fortschrittsbalken?" :wink: Aber da musst du nur ein bisschen im Forum suchen, hab die Frage vor 2 Tagen das letzte mal gesehen.


----------



## Gast LA (9. Jul 2004)

Soweit , so gut. Zwar habe ich jetzt den Ladevorgang der Datei in einen neuen Thread gepackt, eine sichtbare Verbesserung ist jedoch nicht eingetreten. Nach meinem Verständnis müsste das Ganze so ablaufen: (Voraussetzung: Dialogfeld liegt über dem eigentlichen GUI)
Dateiauswahl wird bestätigt
Dialog schliesst sich und verschwindet
GUI wird sichbar(in voller Pracht)
Datei wird in Textfeld geladen

Stattdessen geschieht jedoch quasi alles gleichzeitig. Das sieht einfach Sch.. aus.

Wie also lässt sich dieser Vorgang besser koordinieren???
THX im voraus


----------



## Beni (9. Jul 2004)

Kannst du mal deinen Code posten? (vielleicht hast du das schon, irgendwie benimmt sich das Forum heute komisch ???:L )


----------



## Gast LA (9. Jul 2004)

```
if (choice == JFileChooser.APPROVE_OPTION) {

                status.setText("Lade gewählte Datei. Bitte warten...");
   	filename = jfc.getSelectedFile().getAbsolutePath();

                new Thread(){
                   public void run(){
                    //Datei konvertieren und in Textfeld laden
     	    retValue = textPanel.fillInText(filename);
                   }
                }.start();

                 //ToolTip
                float fileSize = (jfc.getSelectedFile().length()/1024);
                String help = "<html>[b]Datei:  [/b]" + filename + "
" +
                                    "[b]Größe: [/b]" + fileSize + " KB</html>";
                textPanel.instruct.setToolTipText(help);
                status.setText("Datei geladen.");
}
```

So sieht's aus...


----------

