2012-02-02 12 views
0

問題についていくつかの質問があり、それに1時間を費やしましたが、自分では自分で解決できません。私がしたいのは、フォームを開いてsetText()を使ってjLabel1とjTextField1の値を変更するだけです。jLabelとjTextFieldを適切な方法で更新する

Main.java:

package defaultpackage; 

public class Main { 
    public void main(String args[]) { 

     new InfoWindow().setVisible(true); 
     InfoWindow.Refresh("a", "b"); 
     } 
} 

InfoWindow.java:

package defaultpackage; 

public class InfoWindow extends javax.swing.JFrame { 
    public static void Refresh(String label, String textfield) { 
     jLabel1.setText(label); 
     jTextField1.setText(textfield); 
    } 
    public InfoWindow() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jLabel1 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setText("jLabel1"); 

     jTextField1.setText("jTextField1"); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE) 
        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jLabel1) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold> 

    public static void main(String args[]) { 

     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* 
     * If Nimbus (introduced in Java SE 6) is not available, stay with the 
     * default look and feel. For details see 
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(InfoWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(InfoWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(InfoWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(InfoWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new InfoWindow().setVisible(true); 
      } 
     }); 

    } 
    // Variables declaration - do not modify 
    public static javax.swing.JLabel jLabel1; 
    public static javax.swing.JTextField jTextField1; 
    // End of variables declaration 
} 

値がウィンドウに更新されません。私は何が欠けていますか?

答えて

2

mainクラスのMainのメソッドにはstaticというキーワードがないため、これを実行することはできません。

mainメソッドをInfoWindowとし、Refreshを呼び出していないとします。


少数のより多くのポイント:

  • あなたのコンポーネント(JLabelJTextFieldは)static宣言すべきではありません。ウィンドウのインスタンス間でそれらを共有することはできません。
    これはあまりにもRefresh非静的
  • Event Dispatch Thread
  • のJava-方法であなたのフィールドがどのようにあなたのMainだ小文字(refresh代わりのRefresh

で始める更新作るためにあなたを強制します目で

public class Main { 
    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       InfoWindow infoWindow = new InfoWindow(); 
       infoWindow.setVisible(true); 
       infoWindow.refresh("a", "b"); 
      } 
     }); 
    } 
} 
+0

実際には、 'main'メソッドはこれをすべてEDTで実行される実行可能ファイルにラップする必要があります。 – mre

+0

@mre:そうだね、それを指摘してくれてありがとう –

+0

ありがとう、それは今働いている!あなたが素晴らしいです! :) –

2
  1. アップデートコンポーネント:-classはのようになります。 Eイベントディスパッチスレッド
  2. あなたはInfoWindow

のインスタンスに悪いという名前Refreshメソッドを呼び出していることを確認してください、私はあなたがRefresh非静的メソッドを作成し、Javaの命名規則に従ってください示唆しています。また、SwingUtilities.invokeLaterを介してEDTのコンポーネントを作成および変更します。

関連する問題