Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Crotaphytus
Anmeldungsdatum: 08.05.2005 Beiträge: 213
|
Verfasst am: 08. März 2006 21:43 Titel: Java GUI Swing und der ganze Kram |
|
|
Hat irgendjemand Erfahrung mit Swing? Denn ich hätt da wohl doch noch n paar Fragen und seltsame Ergebnisse...
Das erste Problem: Ich hab mir n bisschen was mit NetBeans zusammengeklickt. Jetzt will ich bestimmte Elemente beim Klick auf einen Button erzeugen und anzeigen lassen. Funktioniert, kein Problem.
Nun soll es aber auch wieder möglich sein, diese Elemente zu erzeugen. Dabei hab ich gedacht, es müsste eigentlich reichen, wenn ich das Element aus seinem Container entferne und für den Container die validate() - Methode aufrufe. Tuts aber nicht...
Das Objekt ist zwar effektiv verschwunden (man kann nicht mehr draufklicken), aber es wird noch angezeigt. Sobald das Fenster mal durch irgendwas anderes verdeckt und dann wieder in den Vordergrund geholt wird, ist das Element auch verschwunden.
Als Workaround funktioniert, den Container mit setVisible(false) und setVisible(true) aus- und wieder einzublenden - aber ne schöne Lösung find ich das jetzt nicht.
Die Frage ist: Warum tut validate() hier nicht das, was es eigentlich sollte? _________________ Genie oder Wahnsinn? Wer kann es wissen... |
|
Nach oben |
|
|
|
Tobias
Anmeldungsdatum: 15.02.2005 Beiträge: 149
|
Verfasst am: 08. März 2006 22:20 Titel: |
|
|
Einfach noch ein repaint() hinterherschicken. |
|
Nach oben |
|
|
Crotaphytus
Anmeldungsdatum: 08.05.2005 Beiträge: 213
|
Verfasst am: 09. März 2006 03:24 Titel: |
|
|
Danke schön!
Da hab ich wohl mal wieder den Wald vor lauter Bäumen nicht gesehen... Hab ewig nach ner Methode gesucht, die refresh() oder so in der Art heißt, war dann irgendwann froh, validate() gefunden zu haben, die wenigstens irgendsowas in der Art hätte machen sollen... Aber dass die ausgerechnet repaint() heißt... Na ja, tuts auf jeden Fall wunderbar. _________________ Genie oder Wahnsinn? Wer kann es wissen... |
|
Nach oben |
|
|
Senior Sanchez Gast
|
Verfasst am: 09. März 2006 20:10 Titel: |
|
|
Statt repaint macht sich öfters auch invalideTree() recht gut. |
|
Nach oben |
|
|
Crotaphytus
Anmeldungsdatum: 08.05.2005 Beiträge: 213
|
Verfasst am: 16. März 2006 14:34 Titel: |
|
|
Und noch eine Frage: Gibt es so was wie n mehrzeiliges Label? Also eine Komponente, die Text anzeigt und diesen umbrechen kann.
Denn die Variante mehrzeiliges Textfeld ohne Rahmen mit gleicher Hintergrundfarbe wie der Rest auf disabled find ich nicht so toll... _________________ Genie oder Wahnsinn? Wer kann es wissen... |
|
Nach oben |
|
|
Tobias
Anmeldungsdatum: 15.02.2005 Beiträge: 149
|
Verfasst am: 16. März 2006 14:59 Titel: |
|
|
Entweder du baust dir ein eigenes Object, das sowas kann oder aber du verwendest HTML-Tags als Text in den Labels:
label.setText("<HTML>1. Zeile<BR>2. Zeile<BR>3. Zeile</HTML>"); |
|
Nach oben |
|
|
Crotaphytus
Anmeldungsdatum: 08.05.2005 Beiträge: 213
|
Verfasst am: 16. März 2006 18:00 Titel: |
|
|
Danke!
Und gleich noch ein Problem... Nach einem Mausklick folgen Operationen, die möglicherweise ne ganze Zeit dauern können. Jetzt will nach dem Mausklick irgend ein Hinweisfenster aufploppen lassen, das genau so lange offen bleibt, wie die Berechnung andauert. Gleichzeitig sollten Eingaben im Programm selbst so lange nicht möglich sein.
Ich wollte das eigentlich über nen Dialog realisieren. Da kann ich jedoch nicht modal auf true setzen, weil sonst ja der Dialog gestartet und gleichzeitig die Abarbeitung meiner komplexen Operationen angehalten wird.
Wenn ich jedoch modal auf false setze, werden die Komponenten des Dialogs nicht angezeigt.
Vermutlich hat das irgendwas mit den Threads zu tun... Ich müsst also den Thread des Hauptprogramms anhalten, den Dialog starten und komplett zeichnen lassen und dann das Hauptprogramm wieder reaktivieren. Die Frage is nur wie... Alles was ich versucht hab haut nämlich nicht hin...
Gibts irgendwen, der schon mal so was in der Art gemacht hat und weiß wies geht? _________________ Genie oder Wahnsinn? Wer kann es wissen... |
|
Nach oben |
|
|
as_string
Anmeldungsdatum: 24.02.2006 Beiträge: 80 Wohnort: Heidelberg
|
Verfasst am: 16. März 2006 18:19 Titel: |
|
|
Hallo!
Ja, mit Threads bekommst Du das in den Griff. Du startest den Thread und machst gleich drauf ein modales Dialogfenster auf. Wenn der Thread fertig ist, machst Du es wieder zu. Wahrscheinlich ist es sinnvoll auch einen Abbrechen-Button im Dialogfenster zu haben, der den Thread dann stoppt.
Ich hatte da mal irgendwo ein Beispiel, das so was macht... Muß mal suchen. Wenn ich es finde, dann poste ich das hier nochmal.
Gruß
Marco |
|
Nach oben |
|
|
Crotaphytus
Anmeldungsdatum: 08.05.2005 Beiträge: 213
|
Verfasst am: 17. März 2006 12:10 Titel: |
|
|
Dieses Beispiel wär ne schöne Sache. Denn auch auf die Art hab ich nach wie vor das Problem, dass der Dialog einfach keinen Inhalt hat. _________________ Genie oder Wahnsinn? Wer kann es wissen... |
|
Nach oben |
|
|
Tobias
Anmeldungsdatum: 15.02.2005 Beiträge: 149
|
Verfasst am: 17. März 2006 13:37 Titel: |
|
|
Hier mal ein Beispiel. Es funktioniert folgendermaßen:
Im Hauptprogramm erzeugt man einen TestThread und einen ProgressDialog, welcher den Thread als Argument im Konstruktor erhält.
Der ProgressDialog installiert beim TestThread ein Property-Listener um darüber informiert zu werden, wie weit der Fortschritt ist und wann der Thread beendet ist.
Er erneuert daraufhin seinen Fortschrittsbalken bzw. beendet sich, wenn der Thread zuende ist.
Der TestThread feuert Change-Events immer ab, wenn sie auftreten.
Code: |
// Hauptprogramm irgendwo:
public void actionPerformed(ActionEvent evt) {
String actionCommand = evt.getActionCommand();
if (actionCommand.equals("TEST_ACTION")) {
TestThread thread = new TestThread();
ProgressDialog pd = new ProgressDialog(this, thread);
}
}
|
Code: |
// Die Datei TestThread.java
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class TestThread extends Thread {
private PropertyChangeListener _propertyChangeListener = null;
public void run() {
for (int i=0; i<100; i++) {
for (int j=0; j<9999999; j++)
j = (2*j) / 2;
this.fireProgressIncreased(i);
}
this.fireThreadStopped();
}
private void fireProgressIncreased(int value) {
PropertyChangeEvent event = new PropertyChangeEvent(
this, "PROGRESS_UPDATED", null, new Integer(value));
if (_propertyChangeListener != null)
_propertyChangeListener.propertyChange(event);
}
private void fireThreadStopped() {
PropertyChangeEvent event = new PropertyChangeEvent(
this, "THREAD_STOPPED", null, null);
if (_propertyChangeListener != null)
_propertyChangeListener.propertyChange(event);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
_propertyChangeListener = listener;
}
public int getMaxProgress() {
return 100;
}
}
|
Code: |
Die Datei ProgressDialog.java
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.beans.*;
import javax.swing.*;
public class ProgressDialog extends JDialog implements PropertyChangeListener {
JProgressBar jProgressBar;
private TestThread _thread;
public ProgressDialog(Frame frame, TestThread thread) {
super(frame, "ProgressDialog");
_thread = thread;
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.setLayout(null);
this.setResizable(false);
this.setSize(300, 100);
this.centerWindow();
this.setModal(true);
jProgressBar = new JProgressBar();
jProgressBar.setBounds(20, 20, 260, 30);
jProgressBar.setStringPainted(true);
jProgressBar.setMaximum(_thread.getMaxProgress());
jProgressBar.setValue(0);
this.getContentPane().add(jProgressBar);
_thread.addPropertyChangeListener(this);
_thread.start();
this.setVisible(true);
}
public void propertyChange(PropertyChangeEvent event) {
String propertyName = event.getPropertyName();
if (propertyName.equals("PROGRESS_UPDATED")) {
jProgressBar.setValue(((Integer)event.getNewValue()).intValue());
} else if (propertyName.equals("THREAD_STOPPED")) {
this.setVisible(false);
}
}
private void centerWindow() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
dim.height = dim.height >> 1;
dim.width = dim.width >> 1;
dim.height -= (this.getHeight() >> 1);
dim.width -= (this.getWidth() >> 1);
this.setLocation(dim.width, dim.height);
}
}
|
|
|
Nach oben |
|
|
|