ERLEDIGT
JA
JA
ANTWORTEN
17
17
ZUGRIFFE
482
482
EMPFEHLEN
-
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?
-
13.09.11 15:02 #2
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ß
FabioBitte 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.
-
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.
-
13.09.11 15:07 #4
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.
-
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);
-
13.09.11 15:24 #6
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.
-
13.09.11 15:27 #7SE 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.
-
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.
-
Wenn ich den JDialog mittels
Code java:1
setModalityType(Dialog.ModalityType.MODELESS);
setze, dann wird zwar das Fenster angezeigt, aber ohne Inhalt.
-
13.09.11 15:43 #10SE 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.
-
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?
-
13.09.11 15:49 #12SE 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 !
-
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.09.11 08:25 #14
- 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)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
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
-
Form_Terminate setzt anderes Fenster in Focus --> Problem wenn Fenster b visible = f
Von DrMueller im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 21.07.11, 10:07 -
WLAN Verbindungsversuch wiederholt sich dauernd
Von Mikay Kun im Forum NetzwerkeAntworten: 2Letzter Beitrag: 15.09.09, 21:13 -
Neues Fenster für neuen Inhalt erzwingen (window.open) auch wenn Fenster geöffnet
Von altox-de im Forum PHPAntworten: 2Letzter Beitrag: 19.08.06, 12:38 -
popup fenster auto. schliessen && neue seite in anderem fenster öffnen
Von Sebastian im Forum Javascript & AjaxAntworten: 6Letzter Beitrag: 24.04.06, 11:47 -
link in popup fenster der neues fenster öffnet und bestehendes schliesst.
Von sunny79 im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 18.11.04, 14:43





Zitieren
Login





