Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Java GUI Swing und der ganze Kram
Gehe zu Seite 1, 2  Weiter
 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Java/JSP
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 08. März 2006 21:43    Titel: Java GUI Swing und der ganze Kram Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Tobias



Anmeldungsdatum: 15.02.2005
Beiträge: 149

BeitragVerfasst am: 08. März 2006 22:20    Titel: Antworten mit Zitat

Einfach noch ein repaint() hinterherschicken.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 09. März 2006 03:24    Titel: Antworten mit Zitat

Danke schön! smile

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. smile

_________________
Genie oder Wahnsinn? Wer kann es wissen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Senior Sanchez
Gast





BeitragVerfasst am: 09. März 2006 20:10    Titel: Antworten mit Zitat

Statt repaint macht sich öfters auch invalideTree() recht gut.
Nach oben
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 16. März 2006 14:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Tobias



Anmeldungsdatum: 15.02.2005
Beiträge: 149

BeitragVerfasst am: 16. März 2006 14:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 16. März 2006 18:00    Titel: Antworten mit Zitat

Danke! smile

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
Benutzer-Profile anzeigen Private Nachricht senden
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 16. März 2006 18:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Crotaphytus



Anmeldungsdatum: 08.05.2005
Beiträge: 213

BeitragVerfasst am: 17. März 2006 12:10    Titel: Antworten mit Zitat

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. grübelnd
_________________
Genie oder Wahnsinn? Wer kann es wissen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Tobias



Anmeldungsdatum: 15.02.2005
Beiträge: 149

BeitragVerfasst am: 17. März 2006 13:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Java/JSP Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen