tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
17
ZUGRIFFE
482
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo!

    Ich möchte gerne ein Fenster anzeigen während das Programm versucht auf die Datenbank zu connecten.
    Wie macht man das am besten?

    Ich mach momentan:

    Fenster erstellen( extends JFrame )
    Connection herstellen
    Wenn erfolgreich, dann Fenster.dispose();

    Oder ist der Ansatz falsch?
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,

    also prinzipiell gibt es dafür wahrscheinlich viele Ansätze und letztenendes auch viele Lösungswege. Ich würde es wahrscheinlich über ein Dialog/JDialog lösen. Auf diesen kann man dann einen 'Cancel'-Button setzen, damit der Verbindungsaufbau abgebrochen werden kann.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Ich habs grad auf verschiedene Arten probiert.
    Auch mit einem JDialog. Aber dann macht er nicht weiter.
    Den JDialog in einern SwingWorker schmeißen sodass er im Hintergrund arbeitet hat auch nicht funktioniert.
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Kannst du bitte deinen Code posten wenn du Probleme hast und nicht weiter kommst. So kann ich dir da momentan schlecht weiterhelfen.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Mein JDialog:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    
    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.JDialog;
    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 JDialog
    {
        // 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)
        {
            super( ( (SingleFrameApplication) Application.getInstance() ).getMainFrame(), true );
     
            resourceMap = Application.getInstance().getContext().getResourceMap( getClass() );
     
            initComponent( ( (SingleFrameApplication) Application.getInstance() ).getMainFrame(), text );
        }
        
        /**
         * Statischer Konstruktor
         * @param text
         */
        public static void show( String text )
        {
            WaitingDialog waitingDialog = new WaitingDialog(text);
            waitingDialog.showIt();
        }
     
        /**
         * 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 );
        }
    }

    In der DB-Klasse wo ich die Connectino herstelle habe ich einen Task:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    private class Waiting extends Task<Void, Void>
        {
            private WaitingDialog waitingDialog;
            
            public Waiting()
            {
                super(Application.getInstance());
                this.waitingDialog = new WaitingDialog("Verbindung wird hergestellt...");
            }
     
            @Override
            protected Void doInBackground() throws Exception
            {
                waitingDialog.showIt();
                return null;
            }
            
            /**
             * Abbrechen wurde gedrückt
             */
            @Override
            protected void cancelled()
            {
                waitingDialog.dispose();
            }
        }

    Wenn ich nun den Dialog mittels execute aufrufe, wird leider nichts angezeigt.

    Code java:
    1
    2
    3
    4
    5
    
    Waiting waiting = new Waiting();
    waiting.execute();
    // Connection wird hergestellt
    // Wenn erfolgreich
    waiting.cancel(true);
     

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Baust du die Verbindung zur DB in einem extra Thread auf? Weil das wirst du machen müssen, falls du es nicht schon machst.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    SE Tutorials.de Gastzugang
    Das mit einem JDialog zu lösen ist nicht gerade die beste Lösung denn ein JDialog blockiert den kompletten Programmfluss. Der einzige Work-Around ist das Connecten in eine Thread packen , diesen starten und DANN erst den JDialog anzuzeigen. Aber in der Regel braucht man für sowas keine Info abgeben weil sowas normalerweise sehr schnell geschiet ... zumindest wenn man sich an eine grundlegende Sicherheitsregel hält : User nur von localhost akzeptieren.
     

  8. #8
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Es wird eine Connection zu einer Mysql-Datenbank über das Internet gemacht. Und das dauert manchmal 10-20 sec. Für diese Zeit würde ich gerne eine Meldung ausgeben.

    Warum einen extra Thread für die Connection?

    So mache ich die Connection. Davor würde ich gern das Fenster einblenden. Nach der Funktion wieder ausblenden.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    private void openConnection( String url, String database, String user, String password ) throws SQLException
        {
            MysqlDataSource mysqlDataSource = new MysqlDataSource();
            mysqlDataSource.setURL( url + database );
            mysqlDataSource.setUser( user );
            mysqlDataSource.setPassword( password );
            
            dataSource = mysqlDataSource;
            
            simpleJdbcTemplate = new SimpleJdbcTemplate( dataSource );
            
            // Die Verbindung testen
            Connection connection = dataSource.getConnection();
            connection.close();
        }

    Und jetzt bräuchte ich halt Anregung wie man sowas am besten löst.
     

  9. #9
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Wenn ich den JDialog mittels

    Code java:
    1
    
    setModalityType(Dialog.ModalityType.MODELESS);

    setze, dann wird zwar das Fenster angezeigt, aber ohne Inhalt.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Fenster während Verbindungsversuch-leererjdialog.jpg  
     

  10. #10
    SE Tutorials.de Gastzugang
    Das wäre für mich schon ein zu großes Sicherheitsrisiko Verbindungen dierekt von außen zuzulassen. Ich würde hier eine Proxy-Anwendung auf dem Server installieren der neben einer zusätzlichen Sicherung auch die Angriffsmöglichkeiten verringert da man erstmal diesen Proxy knacken müsste.

    Warum ein extra Thread ? Weil der JDialog , egal ob Model oder nicht , den Programmfluss total blockiert. Darum muss entweder der Caller des JDialogs in einem Thread laufen oder die Verbindung zur Datenbank. Am besten wäre natürlich beide in einzelne Threads auslagern und den Rest der GUI über die modalität zu sperren.

    Eine Verbindung die 10-20sec dauert ? Ist das ohne Modifikation überhaupt so einfach möglich ? Ich dachte nach 5sec kommt das SocketTimeout.
     

  11. #11
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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?
     

  12. #12
    SE Tutorials.de Gastzugang
    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 !
     

  13. #13
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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?
     

  14. #14
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    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.
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  15. #15
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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?

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    
    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);
        }
    }
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 21.07.11, 10:07
  2. WLAN Verbindungsversuch wiederholt sich dauernd
    Von Mikay Kun im Forum Netzwerke
    Antworten: 2
    Letzter Beitrag: 15.09.09, 21:13
  3. Antworten: 2
    Letzter Beitrag: 19.08.06, 12:38
  4. Antworten: 6
    Letzter Beitrag: 24.04.06, 11:47
  5. Antworten: 1
    Letzter Beitrag: 18.11.04, 14:43