是否有可能在Java的CardLayout中获得顶级卡? 我已经尝试循环遍历每个组件以检查isVisible()的可见性,但似乎它们都是“可见的”。
编辑:“顶级卡片”是指当前处于“顶部”的显示器,而不是第一张或最后一张卡片。另外,我不知道它是否有帮助,但我正在寻找一个JPanel(或其子类)
修改:代码段
for (Component component : getComponents()) {
if (component instanceof JPanel && component.isVisible()) {
currentPanel = (JPanel) component;
System.out.println(currentPanel.getClass().getName());
}
}
上面的代码总是打印出每个组件类的名称,无论它们是否是可见卡。
编辑:我将此作为学校作业的一部分。我不是想在这里获得免费赠品,作业并不围绕这种布局。它似乎是在面板之间切换最方便的布局。我的老师已经指定项目中没有第三方代码。我之前看过camickr链接的实现,但我不能使用它。我可以松散地实现它的类似功能,也许可以在文档中引用它,但我不能简单地下载和使用它。
编辑:我试图获得顶级卡片的原因是因为我有一个带有“添加”按钮的工具栏。我没有为我的两个可能的东西添加一个按钮,而是希望通过查看当前正在查看的面板来了解要添加的内容。如果还有其他更合适的方式,请告诉我。
修改:感谢大家的帮助。我弄清楚问题是什么。我想这是我的错,因为我没有提供足够的细节。我的两张牌是JScrollPane
,我还需要查看其中的内容,看看其中一个面板是否是我看到的那个。我没有检查滚动窗格本身上的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;
}
答案 0 :(得分:12)
如果您修改了添加到问题的代码段,则可以轻松判断哪张卡可见。在我的测试框架中,当按下按钮时,它会打印出当前可见卡片的名称,然后再翻转到下一张卡片。修改代码时,要记住的重要一点是,您需要在实际具有CardLayout的组件上调用getComponents()。这样,只有一个孩子可见。我在你的代码中猜测你在包含带有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()方法中,我打印了卡片的名称,但您可以参考当前可见的卡片。
答案 1 :(得分:2)
我扩展了CardLayout以提供此类功能。请参阅Card Layout Focus。
编辑:
然后遍历组件,寻找ZOrder为0的组件。这是在顶部绘制的组件。实际上你甚至不需要遍历所有组件,只需将组件放在位置0。在重叠布局上查看我的博客,以获得有关ZOrder如何工作的更详细描述。
Component visibleComponent = panelWithCardLayout.getComponent(0);
EDIT2:
以上编辑错误。与CardLayout一起使用时,ZOrder没有意义。所以你不能简单地得到组件0。
答案 2 :(得分: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)
抓住“顶牌”。
答案 3 :(得分:-1)
您可以设置根据卡片可见性而变化的变量
例如
int cardShow;
然后将卡片设置为可见
cards.show(card1, "card1");
cardShow = 1;
当您尝试查看哪张卡片时,请使用
if (cardShow == 1)
//code in case of card1 is visible