Moltar
Mitglied
Hallo!
Ich möchte gerne eine JProgressBar anzeigen lassen, während sich mein Client mit dem Server verbindet.
Es wird ein JFrame mit LoginFormular angezeigt.
In meiner Login-Funktion soll nun das LoginPanel gegen mein ProgressPanel ausgetauscht werden.
Dann wird über den Client der Login ausgeführt und am Ende wird das Hauptmenü angezeigt.
Das sieht bei mir so aus (gekürzt):
Das Ganze funktioniert aber nur, wenn die Zeile
aktiv ist.
Die Funktion showPanel(JPanel) wechsel das aktuelle Panel auf dem getContentPane() aus und aktualisiert den JFrame.
MyMessage ist einfach nur eine Erweiterung zu JOptionPane.show...
Warum funktioniert das nur, wenn ich das Dialogfeld anzeigen lasse, obwohl ich doch den Panelwechsel in einen eigenen Thread gepackt habe?
Grüße
Moltar
Ich möchte gerne eine JProgressBar anzeigen lassen, während sich mein Client mit dem Server verbindet.
Es wird ein JFrame mit LoginFormular angezeigt.
In meiner Login-Funktion soll nun das LoginPanel gegen mein ProgressPanel ausgetauscht werden.
Dann wird über den Client der Login ausgeführt und am Ende wird das Hauptmenü angezeigt.
Das sieht bei mir so aus (gekürzt):
Code:
public void login(String username, char[] password) {
if(username == null) {
MyMessage.showError("Benutzername nicht angegeben!");
return;
}
if(password == null) {
MyMessage.showError("Passwort nicht angegeben!");
return;
}
// ProgressPanel anzeigen
panels.put("Progress", new ProgressPanel());
new Thread() {
public void run() {
showPanel("Progress");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// nichts weiter tun
}
});
}
}.start();
//MyMessage.showInfo("Test");
showPanel("Progress");
try {
client.init();
client.login(username, password);
} catch(ClientException e) {
MyMessage.showError(e.getMessage());
return;
}
showPanel("MainMenu");
}
Code:
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class ProgressPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JProgressBar progBar;
private JLabel lblText;
public ProgressPanel() {
super();
init();
progBar.setIndeterminate(true);
}
public ProgressPanel(int max) {
super();
init();
progBar.setIndeterminate(false);
progBar.setMaximum(max);
}
private void init() {
setLayout(new BorderLayout());
progBar = new JProgressBar();
lblText = new JLabel();
JPanel rootPanel = new JPanel();
rootPanel.setLayout(new BorderLayout());
rootPanel.add(progBar, BorderLayout.CENTER);
rootPanel.add(lblText, BorderLayout.PAGE_END);
add(rootPanel, BorderLayout.CENTER);
}
public void setText(String text) {
lblText.setText(text);
}
public void increase(int amount) {
progBar.setValue(progBar.getValue() + amount);
}
}
Das Ganze funktioniert aber nur, wenn die Zeile
Code:
// MyMessage.showInfo("Test");
Die Funktion showPanel(JPanel) wechsel das aktuelle Panel auf dem getContentPane() aus und aktualisiert den JFrame.
MyMessage ist einfach nur eine Erweiterung zu JOptionPane.show...
Warum funktioniert das nur, wenn ich das Dialogfeld anzeigen lasse, obwohl ich doch den Panelwechsel in einen eigenen Thread gepackt habe?
Grüße
Moltar