Java: setText на JLabel в вопросах Swing - PullRequest
1 голос
/ 25 июля 2011

У меня проблема с установкой текста JLabel с помощью метода в классе, создающего графический интерфейс из другого класса, вызывающего этот метод.Метод для установки JLabel вызывается вне GUI, но при вызове изнутри класса GUI он работает.Я протестировал метод getText() на метке после его вызова извне класса GUI, и он показывает, что метка была обновлена.Я понимаю, что это, вероятно, проблема с краской или обновлением Swing, но я не знаю, что делать.Я пробовал repaint() и revalidate() на этикетке, а затем на панели, на которой он находится.Вот мой текущий код:

public void setStatusLabel(String statusEntered) {
    //Shows the variable statusEntered has been received 
    System.out.println(statusEntered);

    //Not working
    status_label.setText(statusEntered);

    //Used this to check if the label receives the data. It does.
    String status = status_label.getText();
    System.out.println(status);
}

И контекст, в котором я его называю.Настраивает соединение с базой данных

//GUI Class reference
MainWindow mainwindow = new MainWindow();

public void connect(){
    Connection conn = null;
    try {
        String userName = "root";
        String password = "";
        String url = "jdbc:mysql://localhost:3306";
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection(url, userName, password);

        //This works
        System.out.println("Connection Established");
        //The issue is with this guy
        mainwindow.setStatusLabel("Connection");
    }
    catch(Exception e) {
        System.err.println("Failed to connect to database");
        mainwindow.setStatusLabel("No connection");
    }
}

Любая помощь с этим будет отличной, или если у вас есть ссылки на предложения, это тоже будет здорово!Спасибо за помощь.

Вот мой главный:

public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MainWindow().setVisible(true);
        }
    });
}

Ответы [ 2 ]

5 голосов
/ 25 июля 2011

Ваша проблема, возможно, одна из справочных - ваша переменная mainwindow в вашем классе GUI может не ссылаться на отображаемый объект MainWindow. Вы звоните new MainWindow(); где-нибудь еще в вашем коде? Если это так, то вам лучше передать ссылку на визуализированное MainWindow в этот класс выше, чтобы вы могли вызывать для него методы, которые приведут к тому, что можно будет увидеть.

Например,

public class DatabaseConnection {
   // MainWindow mainwindow = new MainWindow();  *** don't do this ***
   MainWindow mainwindow;

   public DatabaseConnection(MainWindow mainwindow) {
      this.mainwindow = mainwindow; // pass in the reference in the constructor
   }

   public void connect() {
      Connection conn = null;

      // ... etc

      // now we can call methods on the actual visualized object
      mainwindow.setStatusLabel("Connection");
   }
3 голосов
/ 25 июля 2011

я попытался сделать так, чтобы вы возвращали статус соединения и печатали его в mainWindow status_jlable, здесь вам не нужно передавать ссылку на главное окно в классе базы данных, просто возвращая статус соединения и это все, что вам нужно.

public class MainWindows extends JFrame {

    private JLabel status_label;
    public MainWindows(){
        status_label  = new JLabel("Status");
    }

    public void setStatusLabel(String staus){
        status_label.setText(staus);    
    }
    /*.
     * 
     * your code for visualizing 
    .
    .
    .
    .
    .
    .*/

    public static void main(String args[]){
        MainWindows mw = new MainWindows();

        //this will return true if the connection will estblished and will false if not
        mw.setStatusLabel("Connection established "+ new DatabaseConnection().connect());

    }

}

///////////// класс базы данных

   public class DatabaseConnection{


        public boolean connect(){
            Connection conn = null;


            // adding this new variable to get connection status;
            boolean returnStatus = false;  //default return false if connection established it will true .
            try {
                String userName = "root";
                String password = "";
                String url = "jdbc:mysql://localhost:3306";
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                conn = DriverManager.getConnection(url, userName, password);

                //This works
                System.out.println("Connection Established");
                //The issue is with this guy
                returnStatus = true;  // making status true if connection is established

                return returnStatus;
            }
            catch(Exception e) {
                System.err.println("Failed to connect to database");
                return returnStatus;
            }
        }

    }
...