当前位置: 首页 > 面试题库 >

如何在Java的CardLayout中获得顶级卡片

惠洛华
2023-03-14
问题内容

是否可以在Java的CardLayout中获得顶级卡片?我尝试遍历每个组件以使用isVisible()检查可见性,但似乎它们都是“可见的”。

编辑:“顶卡”是指当前显示在“顶卡”上的那张,而不是第一张或最后一张卡。另外,我不知道它是否有帮助,但我正在寻找一个JPanel(或其子类)

编辑:代码段

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

上面的代码总是打印出每个组件类的名称,无论它们是否是可见的卡片。

编辑
:我正在使用它作为学校作业的一部分。我不是想在这里得到免费赠品,作业不会围绕这种布局展开。这似乎是在面板之间进行切换的最方便的布局。我的老师已指定该项目中没有第三方代码。我之前已经从camickr的链接中看到了实现,但是我不能使用它。我可以宽松地实现它的类似功能,甚至可以在文档中提供参考,但是我不能简单地下载和使用它。

编辑
:我试图获得最高卡的原因是因为我有一个带有“添加”按钮的工具栏。我希望它没有为我的两种可能的事物中的每一个都提供一个添加按钮,而是希望它通过简单地查看当前正在查看的面板来知道要添加的内容。如果还有另一种更合适的方法,请告诉我。

编辑
:谢谢大家的帮助。我找出了问题所在。我想这是我的错,因为我没有提供足够的细节。我的两张卡片是JScrollPanes,我还需要仔细查看其内容以找出这些面板之一是否是我所看到的面板。我没有检查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()。这样,只有一个孩子可见。我猜在您的代码中,您正在包含带有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()方法中,我打印了卡的名称,但是您引用了当前可见的卡。



 类似资料:
  • 问题内容: 我想实现一个单独的ErrorHandler类,该类在某些事件上显示错误消息。该类的行为应从其他不同的类中调用。发生错误时,它将有一个as输出。此AlertView的显示应始终位于顶部。因此,无论从何处引发错误,最顶层的viewController都应显示AlertMessage(例如,当异步后台进程失败时,无论在前台显示什么视图,我都将收到一条错误消息)。 我发现一些要点似乎可以解决我

  • 问题内容: 我看了一个使用此代码的代码示例: 但是,当我使用Eclipse时,我收到一条消息,提示它已过时,我想知道是否还有另一种方法可以在单击按钮时在CardLayout中显示不同的卡片?下面是我的CardLayout类的代码。如果代码的某些部分不正确,也可以提出建议。谢谢! 问题答案: 我看不到Java7 show(容器父代,字符串名称)或Java6 show(容器父代,字符串名称)已过时 如

  • 如何删除用户所在的当前卡。我知道如何使用next和previous函数通过一个卡片布局,但是如何删除用户正在使用的当前帧呢?例如,如果我有一个程序,其中我目前在第3个面板中的5个面板,我将如何删除当前的一个,这是第3个面板。一旦您移除它,下一个或上一个将替换它。我不认为可以使用removecurrentlayout,因为我没有删除组件。例如,在代码中,如果我在卡3上,我将如何删除卡3。

  • 问题内容: 前言(这是一个自答帖子) 我已经开始使用Netbeans GUI Builder了,但是我只是没有开始深入研究它来学习更复杂的细节。我什至不知道从设计角度更改布局管理器的热情,我只是手工编写代码。因此,我尝试通过询问“如何在Netbeans GUI Builder中使用不同的布局管理器”来询问Google服务台,并出人意料地在结果的前两页中找到了zilch。在Eclipse Windo

  • 问题内容: 众所周知,Java ArrayList是使用数组实现的,并以10的容量进行初始化,并将其大小增加50%。如何获得当前ArrayList的容量而不是ArrayList的大小。 谢谢 问题答案: 我认为这是不可能的。您的用例是什么?我相信C#ArrayLists具有属性,但是Java ArrayList类不会公开此信息。 您具有接受初始容量参数的构造函数,并且具有可用于减少增量重新分配量的

  • 我只有java版本1.8.0_45()。所以,你建议的解决方案不能解决我的问题。 当我运行应用程序时,它会抛出以下错误: 意外的顶级异常:错误:com.android.dx.cf.iface。ParseException:com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)处的坏类文件magic(cafe