JavaのCardLayoutでトップカードを取得する方法
-
08-10-2019 - |
質問
JavaのCardLayoutでトップカードを取得することは可能ですか?私は各コンポーネントをループして、iSvisible()での可視性を確認しようとしましたが、それらはすべて「目に見える」ようです。
編集:「トップカード」とは、最初のカードや最後のカードではなく、現在「トップ」にあるものを意味します。また、私はそれが役立つかどうかはわかりませんが、私は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
Sと私はまた、その内容を調べて、それらのパネルの1つが私が見ているパネルであるかどうかを調べる必要がありました。私はチェックしませんでした isVisible()
スクロールペイン自体では、常に表示されている競合を見ていましたが、確認する必要があるのは視界がスクロールペインでした。
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;
}
解決
質問に追加したコードスニペットを変更すると、どのカードが表示されているかを簡単に確認できます。私のテストフレームでは、ボタンがプッシュされると、次のカードにひっくり返す前に、現在見えるカードの名前を印刷します。コードを変更すると、留意すべき重要なことは、実際に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()メソッドでは、カードの名前を印刷しましたが、現在表示されているカードへの参照があります。
他のヒント
CardLayoutを拡張して、このタイプの機能を提供しました。見る カードレイアウトフォーカス.
編集:
次に、0のZorderを使用したコンポーネントを探してコンポーネントをループします。これは、上に塗装されたものです。実際、すべてのコンポーネントを繰り返す必要さえありません。コンポーネントをポジション0に取得するだけです。Zorderの仕組みの詳細については、オーバーラップレイアウトのブログをご覧ください。
Component visibleComponent = panelWithCardLayout.getComponent(0);
編集2:
上記の編集は間違っています。 Zorderには、CardLayoutで使用すると意味がありません。したがって、単にコンポーネント0を取得することはできません。
の実装で CardLayout.first()
これは、上位カードを表示することになっています。
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)
.
カードの可視性に応じて変化する変数を設定できます
例えば
int cardShow;
そして、あなたはあなたのカードを見えるように設定します
cards.show(card1, "card1");
cardShow = 1;
そして、あなたがどのカードを見えるかを取得しようとするとき、使用するだけです
if (cardShow == 1)
//code in case of card1 is visible