2016-07-10 5 views
1

状態変数を変更した後にパネルコンテンツを更新する方法を見つけようとしています。フレーム状態変数を使用してJFrameでJPanelコンテンツを更新する

具体的には、以下の例では、JFrame内に2つのボタンを持つJPanelがあります。アプリケーションが起動すると、その状態変数( "window")は "home"に等しいので、ホームボタンは見えないはずです。ページボタンをクリックすると、状態変数が変化し、フレームの再描画後に両方のボタンの可視性が変化するはずです。 (つまり、ページボタンが消え、ホームボタンが表示されます)。

この場合、ボタンにsetVisibility()メソッドを使用するだけで状態変数を使わずに解決することができます。しかし、私のアプリでは、もっと多くのJComponetnsを状態変数に接続したいと思っています。それを行う方法がありますか?

import java.awt.EventQueue; 

    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import java.awt.BorderLayout; 
    import javax.swing.JButton; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 

    public class JPanelUpdateTest { 

     private JFrame frame; 
     private String window = "home"; 

     public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        try { 
         JPanelUpdateTest window = new JPanelUpdateTest(); 
         window.frame.setVisible(true); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 


     public JPanelUpdateTest() { 
      initialize(); 
     } 


     private void initialize() { 
      frame = new JFrame("JPanelUpdateTest"); 
      frame.setBounds(100, 100, 450, 300); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      JPanel panel = new JPanel(); 
      frame.getContentPane().add(panel, BorderLayout.CENTER); 

      JButton btnHome = new JButton("home"); 
      btnHome.setVisible(window == "home" ? false : true); 
      btnHome.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        window = "page"; 
        panel.revalidate(); 
        frame.repaint(); 
       } 
      }); 
      panel.add(btnHome); 

      JButton btnPage = new JButton("page"); 
      btnPage.setVisible(window == "page" ? false : true); 
      btnPage.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        window = "home"; 
        panel.revalidate(); 
        frame.repaint(); 
       } 
      }); 
      panel.add(btnPage); 
     } 

    } 

答えて

3

問題は、オブジェクトの作成時に、一度呼び出される初期化することであり、それはは一度だけ呼ばれるべき、そしてこのためにsetVisible(...)コードはActionListenerにから呼び出されていません。その代わりに、「バウンドプロパティ」とPropertyChangeListenersを使用している場合を除き、Stateを変更するだけでなく、ActionListeners内にビューを変更するためのメカニズムを配置する必要があります。

私自身、あなたのスワップを支援するために、CardLayoutを使用することをお勧めします。ストリングを直接変更するのではなく、クラスのパブリックメソッドを呼び出す - ActionListener(コントローラ)コードが削除されるビュークラスから取得します。また

、について:

btnPage.setVisible(window == "page" ? false : true); 

==または!=を使用して文字列を比較しません。代わりにequals(...)またはequalsIgnoreCase(...)メソッドを使用してください。あなたが興味を持っていない2つののオブジェクト参照が同じであるかどうかを確認することを理解してください.2つの文字列が同じ順序で同じ文字を持っているかどうかを確認します。

また、JButtonが行っているテキストと動作を変更するだけの場合は、setText(...)を使用してテキストのみを変更し、さらに深い変更を行うにはsetAction(Action action)を呼び出してテキストを変更しますと状態。

+0

ありがとうございました。今、私は参照してください...メソッドで編集するためにクラス定数としてコンポーネントを設定する場合、それは動作します。それは多くの定数を意味するので、代わりにCardLayoutを試してみます。 equals()もありがとう。ほんとうにありがとう。 – Jakub

関連する問題