Unterframe aus ActionListener

Status
Nicht offen für weitere Antworten.

Seddy

Mitglied
Hallo Zusammen, hier mal meine Situation:
Ich habe ein GUI welches im wesentlichen aus einem JFrame und einigen JButtons besteht, auf einem dieser JButtons liegt nun ein ActionListener:
Java:
jb_server.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//Funktion
}});
In diesem ActionListener wird nun eine Funktion aufgerufen die sehr lange braucht um die Berechnungen durchzuführen, desewegen möchte ich gerne ein weiteres Fenster erstellen welches einen Prozentbalken anzeigt, das klappt als Trockenübung auch sehr gut, ich habe einfach eine neue Klasse erstellt die einen JFrame implementiert, allerdings kommt jetzt das Problem:
Wenn ich aus dem ActionListener herraus einen neuen JFrame erstelle wird dieser zwar erstellt, aber nie aktualisiert solange der ActionListener nicht durchgelaufen ist, sprich ich bekomme nur einen leeren Frame angezeigt, dessen Inhalt erst angezeigt wird, wenn die Funktion dessen Status ich visualisieren möchte schon beendet ist.
Wie kann ich nun dafür sorgen, dass der neue Frame sofort nach dem erstellen nutzbar ist?
 

KrokoDiehl

Top Contributor
Startest du den neuen Frame über SwingUtilities.invokeLater()? Sprich
Java:
SwingUtilities.invokeLater(new Runnable()
{
    @Override
    public void run()
    {
        neuerFrame.setVisible(true);
    }
});
 

Seddy

Mitglied
Startest du den neuen Frame über SwingUtilities.invokeLater()?
Soweit ich weiß nicht, ich poste einfach mal den Code von dem Frame, der ist nicht so lang:
Java:
/* LoadScreen.java
** -zeigt ein Fenster mit Prozentanzeige
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LoadScreen extends JFrame{

	private JLabel proz1;
	private JLabel proz2;
	
	//Konstruktor zeigt das Fenster an
	public LoadScreen(String title){
		super(title);
		init(title);
	}

	//Konstruktor zeigt das Fenster an (default Titel)
	public LoadScreen(){
		super("laden...");
		init("laden...");
	}
	
	//initialisiert Fenster
	private void init(String title){
	
		//hellblaues Fenster ohne Umrandung
		setUndecorated(true);
		getContentPane().setLayout(null);
		setBounds(300,300,120,40);
		getContentPane().setBackground(new Color(168,203,233));
		
		//Text
		proz1=new JLabel(title);
		proz1.setBounds(40,5,100,15);
		getContentPane().add(proz1);
		
		//Balkenhintergrund
		proz1=new JLabel();
		proz1.setOpaque(true);
		proz1.setBackground(Color.white);
		proz1.setBounds(10,20,100,15);
		getContentPane().add(proz1);
		
		//Balken
		proz2=new JLabel();
		proz2.setOpaque(true);
		proz2.setBackground(Color.green);
		proz2.setBounds(10,20,0,15);
		getContentPane().add(proz2);
		setVisible(true);
		
	}
	
	//Destruktor schließt das Fenster
	public void close(){
		dispose();
	}
	
	//passt die Prozentanzeige an
	public void set(int p){
		proz1.setBounds(10+p,20,100-p,15);
		proz2.setBounds(10,20,p,15);
	}
	
}

Noch eine Anmerkung:
der erste Frame in dem sich der Button befindet "hängt" während der Berechnung auch.
 

KrokoDiehl

Top Contributor
Ja weil der erste Frame noch im ActionListener hängt. Benutze mal den von mir genannten Code zum Starten des zweiten Frames in deinem ActionListener und ändere die Zeile mit
Code:
setVisible(true)
dort auf
Code:
new LoadScreen("MeinTitel");
.
 

Seddy

Mitglied
Gut, das habe ich nun gemacht, es ergeben sich aber folgende Probleme:
Java:
LoadScreen ls=new LoadScreen();
SwingUtilities.invokeLater(new Runnable(){
  public void run(){
    ls=new LoadScreen();
  }
});
Wird nicht angenommen:
Code:
local variable ls is accessed from within inner class; needs to be declared final
Wenn ich nun einfach zum testen nur
Java:
new LoadScreen();
reinschreibe geht das zwar, aber der Frame wird auch erst sichtbar, wenn die Berechnung beendet ist.
 

KrokoDiehl

Top Contributor
Es geht darum, dass der neue Frame in einem eigenen Displaythread gestartet wird, genau das macht das
Code:
 invokeLater()
. Wenn man
Code:
new LoadScreen()
macht, wird dort bereits über die
Code:
init()
-Methode der Frame angezeigt, d.h. der Konstruktoraufruf muss in das
Code:
invokeLater()
rein.
Wenn du sonst noch Zugriff auf das Frame-Objekt haben willst, könntest du es so machen:
Java:
public void actionPerformed(ActionEvent event)
{
    final LoadScreen frame = null;
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            // Erstellen und Anzeigen
            frame = new LoadScreen("meinTitel");
        }
    }
}
 

Seddy

Mitglied
Der Code funktioniert (bei mir) nicht:
Code:
cannot assign a value to final variable frame
 

KrokoDiehl

Top Contributor
Ach so ja ... mein Fehler ;) final kann man ja nur einmal belegen.
Java:
public void actionPerformed(ActionEvent event)
{
    //A    
    final LoadScreen frame;

    //B (Deklaration weglassen)

    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            //A Erstellen und Anzeigen
            frame = new LoadScreen("meinTitel");

            //B oder nur
            new LoadScreen("meinTitel");
        }
    }
}
 

Seddy

Mitglied
Das bringt mich immer noch nicht weiter, denn final Variablen kann man nur bei der Deklaration belegen , das gibt also immer noch den selben Fehler, und wie ich schon sagte wird das ohne Referenz erstellte Fenster trotz invokeLater erst nach der Beendigung der Funktion aufgerufen.
 

Seddy

Mitglied
Ok, hier mal die wichtigsten Codeauschnitte:
Java:
//Der Aufruf:
jb_suche.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				alleLieder.refresh(jtf_suche.getText());
			}
		});

//die Funktion refresh:
public void refresh(String search) {
	
		Vector<Vector<String>> inhalt=null;
		switch(which){
			case 1:
				inhalt=client.alleLieder(search);
				break;

//die Funktion alleLieder ruft die Funktion getSonginfoList auf, Auschnitt daraus:
//LoadScreen ls=new LoadScreen();
  		SwingUtilities.invokeLater(new Runnable(){
				public void run(){
					new LoadScreen();
				}
			});

Das ist aber alles nicht so wichtig, denn es reicht schon dieses einfache Beispiel:
Java:
jb_suche.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
    SwingUtilities.invokeLater(new Runnable(){
      public void run(){
        new LoadScreen();
      }
    });	
    try{
      Thread.sleep(5000);
    }catch(Exception e2){}
  }
});
Auch hier erscheint der LoadScreen erst wenn das sleep beendet ist.
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Ok.
Das
Code:
 invokeLater()
schiebt die Anzeige des Frames in die Ereigniskette und führt sie sobald aus (deswegen invokeLATER), wenn aber das aktuelle Ereignis (das
Code:
actionPerformed()
) lange braucht, kommt der Frame natürlich noch nicht dran.
Was du machen musst, ist die lange Bearbeitung in einen Thread auslagern. Entweder du schaffst es, es in deinen zweiten Frame zu machen, oder du machst einen eigenen Thread (bzw. einen SwingWorker), der seine Fortschritte meldet.
Letztere Methode ist wohl die saubere und du müsstest wahrscheinlich nicht einmal einen neuen Frame erstellen, der einen Fortschrittsbalken anzeigt, sondern könntest ihn im gleichen Fenster anzeigen lassen. Z.B. wie bei einigen Browsern rechts unten in der Ecke.
 

Seddy

Mitglied
Sehr gut, so geht es:
Java:
jb_suche.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
    new Thread() {
      public void run(){
        alleLieder.refresh(jtf_suche.getText());
      }
    }.start();
  }
});
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
G gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben