Fenster während Verbindungsversuch

hesk

Erfahrenes Mitglied
Vielleicht dauert es auch nur 4 sec. Mir geht es auf jeden Fall um einen Nachricht für den User dass die Verbindung hergestellt wird.

Ich habe den JDialog in einem Task gesteckt(code ist oben). Leider wird das Fenster nicht richtig angezeigt.
Vielleicht etwas anderes als einen JDialog verwenden?
 
S

SE

Warum machst du das so umständlich ? Pack es in einen Thread / Runnable ... weg mit dem Task ...
Und dann noch setModalityType ... es gibt einen entsprechenden Konstruktor wenn du dich mal mit super() auseinandersetzen würdest ... was im übrigen auch fehlt. Dazu ist die Methode void show() deprecated ... auch wenn du sie überschreibst ... > anderer Name !
 

hesk

Erfahrenes Mitglied
Häh?
Der Task ist quasi das selbe wie ein Thread/Runnable.
Der super()-Befehl befindet sich im Konstruktor.
Ich verwende nicht die Methode show, sonder showIt.

Hat jemand noch Ideen woran es liegen könnte das im Fenster nichts angezeigt wrid?
 

genodeftest

Erfahrenes Mitglied
2 Möglichkeiten:

1. repaint-Fehler (dürfte dann aber nicht behoben werden, selbst wenn eine Verbindung da ist oder du das Fenster resizest/minimierts+maximierst)

2. Du wartest im Java-AWT-Thread/Event-Dispatch-Thread blockierend auf irgend eine Operation (was man bei I/O niemals machen sollte), höchst wahrscheinlich auf die oben genannte Verbindung.
 

hesk

Erfahrenes Mitglied
So...ich habe nun ein Testprogramm geschrieben welches mein Problem veranschaulichen soll.

Was ich will:

.) Es wird ein Fenster(JFrame) in einem neuen Thread angezeigt
.) Es wird einige Sekunden etwas gemacht(connection hergestellt)
.) Wenn dies erfolgreich war, wird der Thread mit dem JFrame gestopt

Bei meinem Testprogramm wird das Fenster angezeigt, aber ohne Inhalt(wie das Bild weiter oben was ich gepostet habe). Erst nach den 10 Sekunden wird der Inhalt richtig angezeigt.
Wieso?

Java:
package sonstiges;

import heskSystem.zauberperlen.dialogs.WaitingDialog;

import java.sql.SQLException;

import javax.swing.UIManager;

import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.Task;

/**
 * Start von Zauberperlen
 * 
 * @author MaRk
 */
public class ThreadFrame extends SingleFrameApplication
{
    /**
     * At startup create and show the main frame of the application.
     */
    @Override
    protected void startup()
    {
        try
        {
            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
        }
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        WaitingDialog waitingDialog = new WaitingDialog("Verbindung wird hergestellt...");
        
        Test test = new Test(waitingDialog);
        test.execute();
        
        try
        {
            Thread.sleep(10000);
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        
        System.out.println("da");
   
        test.cancel(true);
    }

    @Override
    protected void shutdown()
    {
        // The default shutdown saves session window state.
        super.shutdown();

        // Now perform any other shutdown tasks you need.
    }

    /**
     * This method is to initialize the specified window by injecting resources. Windows shown in our application come
     * fully initialized from the GUI builder, so this additional configuration is not needed.
     */
    @Override
    protected void configureWindow( java.awt.Window root )
    {
    }

    /**
     * Main method launching the application.
     */
    public static void main( String[] args )
    {
        launch( ThreadFrame.class, args );
    }
    
    /**
     * Zeigt einen Dialog an damit der User weiß dass die Verbindung aufgebaut wird.
     * 
     * @author MaRk
     */
    private class Test extends Task<Void, Void>
    {
        private WaitingDialog waitingDialog;
        
        public Test(WaitingDialog waitingDialog)
        {
            super( Application.getInstance() );
            
            this.waitingDialog = waitingDialog;
        }

        @Override
        protected Void doInBackground() throws SQLException
        {
            waitingDialog.showIt();
            
            return null;
        }
    }
}


WaitingDialog:

Java:
package heskSystem.zauberperlen.dialogs;

import heskSystem.zauberperlen.objects.GridBagLayoutEditor;

import java.awt.Font;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;

import org.jdesktop.application.Application;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;

@SuppressWarnings("serial")
public class WaitingDialog extends JFrame
{
    // GridBagConstraints
    @SuppressWarnings("unused")
    private int gridx, gridy, gridwidth, gridheight, fill, anchor, ipadx, ipady;
    private double weightx, weighty;
    @SuppressWarnings("unused")
    private Insets defaultInsets;

    private ResourceMap resourceMap;

    /**
     * Konstruktor Creates the reusable dialog.
     */
    public WaitingDialog( String text )
    {
        resourceMap = Application.getInstance().getContext().getResourceMap(getClass());

        initComponent(((SingleFrameApplication)Application.getInstance()).getMainFrame(), text);
    }

    /**
     * Initialisiert die Komponenten
     * 
     * @throws Exception
     */
    public void initComponent( Frame parentFrame, String text )
    {
        // setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
        // setUndecorated(true);
        //setResizable(false);

        setLayout(new GridBagLayout());

        // Bild
        GridBagLayoutEditor.setDefaultValuesGB(this);
        JLabel bild = new JLabel(resourceMap.getImageIcon("waiting.icon"));
        GridBagLayoutEditor.addGB(this, bild, gridx = 0, gridy = 0,
                                  gridwidth, gridheight, fill = GridBagConstraints.BOTH,
                                  weightx, weighty, anchor,
                                  new Insets(20, 20, 20, 20));

        // Text
        GridBagLayoutEditor.setDefaultValuesGB(this);
        JLabel labelText = new JLabel(text);
        labelText.setFont(new Font("Calibri", Font.PLAIN, 15));
        GridBagLayoutEditor.addGB(this, labelText, gridx = 0, gridy = 1,
                                  gridwidth, gridheight, fill,
                                  weightx = 1, weighty, anchor,
                                  new Insets(5, 20, 5, 20));

        pack();
        setLocationRelativeTo(parentFrame);
    }

    public void showIt()
    {
        setVisible(true);
    }

    public void hideIt()
    {
        setVisible(false);
    }
}
 
S

SE

Dann makiere ihn bitte als ERLEDIGT.
Es wäre außerdem fair wenn du deinen neuen Lösungsweg posten würdest damit andere auch etwas davon haben.
 

Neue Beiträge