2016-03-28 12 views
-3

私は自分のコースワークのために作っているアプレットに助けが必要です。異なるクラスのカードレイアウト

私はカードレイアウトを使用しています。それぞれのカードの内容を別のクラスから取りたいと思っています。その後、各カードで、ボタンを他のカードに切り替えるようにします。同様の方法で動作する例を見てきましたが、アプレットではなくJFrameに基づいています。

私は外部リンクを送ってはいけません。数日前からカードのレイアウトを研究しています。私はJavaの初心者です。私は遅い学習者です。誰かに私に基本的な例を示し、それがどのように行われるかを説明したい。ありがとうございました!

public class MainClass extends JApplet implements ActionListener { 

     boolean inAnApplet = true; 
     JButton btn1, btn2; 
     JPanel cards; 
     final static String PANEL1 = ""; 
     final static String PANEL2 = ""; 


     public MainClass() { 

      Container contentPane = getContentPane(); 
      JPanel cbp = new JPanel();   
      cbp.add(new JLabel ("Hello world!")); 

      contentPane.add(cbp, BorderLayout.NORTH); 
      cards = new JPanel(); 
      cards.setLayout(new CardLayout());  


      JPanel p1 = new JPanel(); 
      p1.add(new JLabel("First panel!")); 
      btn1 = new JButton("Text panel"); 
      btn1.addActionListener(this); 
      p1.add(btn1); 


      JPanel p2 = new JPanel(); 
      p2.add(new JLabel("Second panel!")); 
      btn2 = new JButton("Button panel"); 
      btn2.addActionListener(this); 
      p2.add(btn2); 

      cards.add(p1, PANEL1); 
      cards.add(p2, PANEL2); 
      contentPane.add(cards, BorderLayout.CENTER); 


     } 

     public void init(){} 

     public void actionPerformed(ActionEvent evt) { 

      CardLayout cl = (CardLayout)(cards.getLayout()); 

       if(evt.getSource() == btn1) 
       { 
        cl.show(cards, PANEL1); 
       } 
       else if(evt.getSource() == btn2) 
       { 
        cl.show(cards, PANEL2); 
       } 
      } 
    } 
+1

を '表示したいカードの名前を知っている必要があり、レイアウトマネージャを持っていることを

JButton button = (JButton)e.getSource(); JPanel someCustomPanel = (JPanel)button.getParent(); JPanel cardLayoutPanel = (JPanel)someCustomPanel.getParent(); CardLayout layout = (CardLayout)cardLayoutPanel.getLayout(); layout.show(cardLayoutPanel, "..."); 

基本的な例とそれがどのように行われたかを説明します。 - [CardLayoutの使い方](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)のSwingチュートリアルのセクションを読んでください。作業デモコード。コードをダウンロードして遊んでください。あなたが理解していないチュートリアルコードについて何かがある場合は、私たちに特定の質問をすることができます。あなたが理解していないものは推測できません。たとえば、チュートリアルでは、カード名は実際に空のStringではない値を持っています。 – camickr

+0

ご意見ありがとうございます。私はこのチュートリアルを何度か読んだ。私が与えたコードはそのチュートリアルから抜粋したものです。私はカードレイアウトの仕組みを理解していますが、各カード(パネル)を別のクラスにする方法はわかりません。 – darijus

答えて

2

私が与えたコードは、そのチュートリアルからそのまま取り入れられています。

なぜ、あなたのPANEL1とPANEL2変数に値がありませんか?あなたがカードの名前を指定しないと、それはどのように動作すると思いますか?作業用コードをコピーしないと、何かが動作することを期待していますか?チュートリアルのコードに従わなくても作業コードを提供するのはなぜですか?私たちが提供するコードは、どうしてあなたは違うと思いますか?

しかし、私は各カードを別のクラスにする方法を理解していません。

違いはありません。カードを表示したい場合は、表示したいカードの名前を知る必要があります。

今、あなたが使用します。

JPanel p1 = new JPanel(); 
cards.add(p1, PANEL1); 

ので、パネルは別のクラスである場合、コードは次のようになります。

JPanel p1 = new SomeCustomPanel() 
cards.add(p1, PANEL1); 

あなたはその後、別のパネルですべてのコードをしたい場合親パネルからレイアウトマネージャを取得する必要がありますので、各パネルのActionListenerのコードは次のようになります:

JPanel parent = childPanel.getParent(); 
CardLayout layout = (CardLayout)parent.getLayout(); 

これで、レイアウトマネージャにアクセスできるようになり、各カードの名前がわかっていると仮定してカードを切り替えることができます。各カードの名前とカード名の割り当て方法はあなた次第です。

編集:

public class SomeCustomPanel extends JPanel 
{ 
    public SomeCustomPanel 
    { 
     add(new JLabel("I'm a JLabel")); 
     JButton button = new JButton("Switch Panel"); 
     add(button); 
     button.addActionListener(...); // add ActionListener to swap cards 
    } 
} 

編集:

まあ、私はあなたがパネルにコンポーネントを追加するときcomonents間の親/子関係を表示しようとするこれらの名前を使用、または別のパネルに1枚のパネル。

ActionListenerを使用すると、ActionEventのソースはJButtonになります。 ActionEventを生成したボタンがあれば、CardLayoutを使用してパネルを見つけるまで、親/子チェーンを元に戻すことができます。

だからあなたのコードをもっと次のようになります。今、あなたはちょうどあなたが、私は誰かが表示したいと思い

+0

落ち着いて、私が提供したコードはうまく動作します。私はあなたのコードを置いてパネルを別のクラスにすることができますか? – darijus

+0

あなたが提供したコードは、私があなたに与えた理由でうまく動作しません。あなたは新しいクラスを作成します。クラスを作成するのはJava 101なので、混乱がどこにあるのか分かりません。 – camickr

+0

ありがとうございました!これはまさに私が必要としていたものです。 – darijus

1

JPanelのレイアウトマネージャをCardLayoutに設定しました。そのため、カードは、JPanelに追加できる任意のクラス(つまり、Componentの任意のComponentまたはサブクラス)にすることができます。

+0

私に例を教えてください。 例えば、これを移動するにはどうすればいいですか? JPanel p1 = new JPanel(); p1.add(新しいJLabel( "最初のパネル!")); btn1 =新しいJButton( "テキストパネル"); btn1.addActionListener(this); p1.add(btn1); 別のクラスには? – darijus

関連する問題