2010-12-10 17 views
13

JavaのCardLayoutで一番上のカードを取得することは可能ですか? 私は各コンポーネントをループして、isVisible()の可視性をチェックしようとしましたが、それらはすべて「可視」であるようです。JavaのCardLayoutで一番上のカードを取得する方法

編集:「トップカード」とは、現在表示されている「トップ」にあるものを意味し、最初または最後のカードではありません。また、それは場合に役立ちます私は知らないが、私はJPanelの(またはそのサブクラス)を探しています

編集:コード上記のコードは常に、すべてのコンポーネントクラスの名前を出力します

for (Component component : getComponents()) { 
if (component instanceof JPanel && component.isVisible()) { 
    currentPanel = (JPanel) component; 
    System.out.println(currentPanel.getClass().getName()); 
} 
} 

スニペット目に見えるカードであるかどうかに関係なく、

編集:私はこれを学校の課題の一部として使用しています。私はここで空き缶を取得しようとしていない、割り当てはこのレイアウトの周りを回転しません。それは、パネル間の変更に最も便利なレイアウトのようです。私の先生は、プロジェクトに第三者コードがないように指定しました。以前はcamickrのリンクからの実装を見たことがありますが、使用できません。私は似たような機能をゆるやかに実装することもできますし、ドキュメンテーションで参考にすることもできますが、単純にダウンロードして使用することはできません。

編集:私がトップカードを手に入れようとしている理由は、「追加」ボタンが付いたツールバーがあるからです。私の可能性のある2つのもののそれぞれに1つの追加ボタンを表示するのではなく、現在どのパネルが表示されているかを見るだけで、どれを追加するかを知りたいと思っていました。これを行うための別の、より適切な方法がある場合は、私に知らせてください。

を編集してください。ありがとうございました。私は問題が何かを考え出した。私は十分な詳細を提供していないので、それは私のせいだと思う。私のカードのうちの2枚はJScrollPaneです。また、その中の1枚が私が見ていたものかどうかを調べるために、その内容を調べる必要がありました。私はisVisible()のスクロールペイン自体をチェックしていませんでした。私はそれが常に目に見えていると主張していました。確認する必要があるのはスクロールペインです。

次ている目に見える一番上のカードを設定することになっている CardLayout.first()の実装では
public JPanel getCurrentPanel() { 
     JPanel currentPanel = null; 

     for (Component component : getComponents()) { 
      if (component.isVisible()) { 
       if (component instanceof JPanel) 
        currentPanel = (JPanel) component; 
       else if (component instanceof JScrollPane) 
        currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0); 
      } 
     } 

     return currentPanel; 
    } 

答えて

11

質問に追加したコードスニペットを変更すると、表示されているカードを簡単に知ることができます。私のテストフレームでは、ボタンを押すと、現在表示されているカードの名前が表示され、次のカードに切り替わります。コードを変更する際には、実際にCardLayoutを持つコンポーネントでgetComponents()を呼び出す必要があることに留意することが重要です。そうすれば、子供のうちの1人だけが見えるようになります。あなたのコードでは、CardLayoutでJPanelを含むフレームのgetComponentsを呼び出していると思います。

class TestFrame 
     extends JFrame 
     implements ActionListener 
{ 
    public TestFrame() 
    { 
     cards = new JPanel(new CardLayout()); 
     card_list = new JPanel[5]; 

     for (int i = 0; i < card_list.length; i++) { 
      String text = "Card " + i; 
      JPanel card = createCard(text); 
      card_list[i] = card; 
      cards.add(card, text); 
     } 

     add(cards); 
    } 

public JPanel getCurrentCard() 
{ 
    JPanel card = null; 

    for (Component comp : cards.getComponents()) { 
     if (comp.isVisible() == true) { 
      card = (JPanel)comp; 
      System.out.println(card.getName()); 
     } 
    } 
    System.out.println(); 

    return card; 
} 

public void actionPerformed(ActionEvent evt) 
{ 
    JPanel card = getCurrentCard(); 

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

    public JPanel createCard(String text) 
    { 
     JPanel card = new JPanel(); 
     card.setName(text); 

     JButton btn = new JButton(text); 
     btn.addActionListener(this); 

     card.add(btn); 
     return card; 
    } 

    JPanel cards; 
    JPanel[] card_list; 
} 

actionPerformed()メソッドでは、カードの名前が表示されましたが、現在表示されているカードへの参照があります。

+0

@RDのコードスニペットは、CardLayoutを使用するJPanelの 'getCurrentPanel()'メソッドの試行に由来します。私はJPanelを他の理由で拡張しました。したがって、私はそれにアクセスできます。 – alexcoco

+0

あなたのコードをすべて見ることなく、何がうまくいかないのかは分かりませんが、私のTestFrameコードは一度に1つの目に見えるカードしか正しく見つけることができません。 –

+0

@alexcoco、関連コードをgetCurrentCard()メソッドに入れるように編集しました。 –

0

int ncomponents = parent.getComponentCount(); 
for (int i = 0 ; i < ncomponents ; i++) { 
    Component comp = parent.getComponent(i); 
    if (comp.isVisible()) { 
     comp.setVisible(false);  // hide previously visible components 
     break; 
    } 
} 

if (ncomponents > 0) { 
    currentCard = 0; 
    parent.getComponent(0).setVisible(true); // set visibility of component 0 
    parent.validate(); 
} 

をので、私はあなたがyourContainer.getComponent(0)で「一番上のカード」を手に入れることができたとします。

+0

申し訳ありませんが、私は最初のカードを意味しませんでした。私は質問を更新しました。 – alexcoco

+2

ああ。私の悪い。あなたがコンポーネントをループして 'isVisible'を探すことができるはずですが...これはうまくいかないのでしょうか? – aioobe

+0

ええと、それらをすべてループして値を印刷すると、目に見えるカードが変更されたにもかかわらず、最後の1枚のカードが残ってしまいます。スニペットで1秒後に更新します。 – alexcoco

2

このタイプの機能を提供するために、CardLayoutを拡張しました。 Card Layout Focusを参照してください。

編集:

を0これのZORDERとcompnentを探している部品を通るループが一番上に描画されたものです。実際には、すべてのコンポーネントを繰り返し処理する必要はありません。位置0のコンポーネントを取得するだけです。ZOrderの動作の詳細については、オーバーラップレイアウトのブログをご覧ください。

Component visibleComponent = panelWithCardLayout.getComponent(0); 

EDIT2:

上記の編集が間違っています。 ZOrderは、CardLayoutで使用すると意味を持ちません。つまり、単にコンポーネント0を取得することはできません。

+0

はい、私は以前これを見ました。しかし、私はそれをすることはできません。私は2番目の説明で質問を更新します。 – alexcoco

+0

@alexcoco、編集を参照してください。 – camickr

+0

今、それを見て、 – alexcoco

-1

あなたは一例

int cardShow; 

、その後、あなたが

cards.show(card1, "card1"); 
cardShow = 1; 

あなたのカードが見え設定し、どのカードを取得しようとするためのカード視界

に依存して変化する変数を設定することができます見えるだけです

if (cardShow == 1) 
//code in case of card1 is visible 
関連する問題