Avatar billede dennism Nybegynder
27. november 2006 - 18:31 Der er 3 kommentarer og
1 løsning

Java: Problem med Frame

Jeg har lavet denne klasse, som kan forbinde til en database:

import java.sql.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class main {

    private static JFrame frameLoading;
   
    public static void main(String[] args) {
        JFrame frame = new JFrame("Connect to database");
       
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton connectButton = new JButton("Connect");
       
        frame.add(connectButton, BorderLayout.CENTER);

        frame.pack();
        frame.setLocation(200,200);
        frame.setVisible(true);
       
        connectButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    if (connect()) {
                        System.out.println("Connected");
                    } else {
                        System.out.println("Can't connected");
                    }
                   
                }
        });
    }
   
    public static boolean connect() {
        String server = "192.168.1.35";
        String username = "root";
        String password = "myPassword";
        String database = "horseBetting";
       
        connectFrame();
       
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://"+server+"/"+database, username, password);
            frameLoading.setVisible(false);
            return true;
        } catch (Exception ex) {
            frameLoading.setVisible(false);
            System.out.println(ex);
            return false;
        }

    }
   
    private static void connectFrame() {
        frameLoading = new JFrame("Connecting to database...");
       
        frameLoading.setResizable(false);
        frameLoading.setAlwaysOnTop(true);
        frameLoading.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        JLabel textLabel = new JLabel("Connecting...");
       
        frameLoading.add(textLabel, BorderLayout.CENTER);

        frameLoading.pack();
        frameLoading.setSize(200,80);
        frameLoading.setLocation(300,300);
        frameLoading.setVisible(true);
    }
   
}

Når jeg kører programmet, trykker og trykker på connect kan man ikke se teksten i Frame mens der forbindes. Hvordan kan det være? Hvis jeg kører connect uden for min ActionListener kører det helt perfekt.

NB.: Programmer kræver at du et mySQL-libary kørende, kan hentes her:
http://dev.mysql.com/downloads/connector/j/3.1.html
Avatar billede lborupj Nybegynder
27. november 2006 - 18:41 #1
Det er fordi du kører din connect rutiner i AWT's GUI thread. Dvs. den tråd der står for opdatere GUI'et (blandt andet). Du bør skille din connect kode ud i en tråd for sig selv (det smarteste) og så singalere til GUI'et når/hvad der sker.. Alternativt kan du lave en SwingUtilities.invokeLater(new Runnable() { public void run() {
... kode til at connecte med ...
} });
Så bliver din connect kode scheduled til at blive eksekveret senere på GUI tråden, men som sagt er det bedst at skille det helt ud.
Avatar billede dennism Nybegynder
27. november 2006 - 19:04 #2
Vil du give mig et kodeeksempel, hvor du viser hvad du mner med at skille det helt ud?
Avatar billede dennism Nybegynder
27. november 2006 - 22:09 #3
Jeg har forsøgt at smide en invokeLater ind, men det giver samme resultat:

import java.sql.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class main {

    private static JFrame frameLoading;
   
    public static void main(String[] args) {
        JFrame frame = new JFrame("Connect to database");
       
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton connectButton = new JButton("Connect");
       
        frame.add(connectButton, BorderLayout.CENTER);

        frame.pack();
        frame.setLocation(200,200);
        frame.setVisible(true);
       
        connectButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    if (connect()) {
                        System.out.println("Connected");
                    } else {
                        System.out.println("Can't connected");
                    }
                   
                }
        });
    }
   
    public static boolean connect() {
        connectFrame();
       
        SwingUtilities.invokeLater(new Runnable() { public void run() {
       
            String server = "localhost";
            String username = "root";
            String password = "myPassword";
            String database = "myDatabase";

            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection("jdbc:mysql://"+server+"/"+database, username, password);
                frameLoading.setVisible(false);
            } catch (Exception ex) {
                frameLoading.setVisible(false);
                System.out.println(ex);
            }
       
        }});
       
        return true;

    }
   
    private static void connectFrame() {
        frameLoading = new JFrame("Connecting to database...");
       
        frameLoading.setResizable(false);
        frameLoading.setAlwaysOnTop(true);
        frameLoading.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        JLabel textLabel = new JLabel("Connecting...");
       
        frameLoading.add(textLabel, BorderLayout.CENTER);

        frameLoading.pack();
        frameLoading.setSize(200,80);
        frameLoading.setLocation(300,300);
        frameLoading.setVisible(true);
    }
   
}
Avatar billede dennism Nybegynder
29. november 2006 - 10:04 #4
Jeg fandt ud af, at løsningen var at arbejde i flere Thread
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB