1

我有一组按 CardLayout 排列的 JPanel。问题是,当我在一个 JPanel 中更改内容时,我希望这些更改反映在另一个 JPanel 中,该 JPanel 是同一套牌中的一张卡片。我在每个 JPanel 对象上定义了一个 refresh() 方法,但我不能使用用于移动卡片的语法来调用它们。(这里 p 是卡片组的容器卡片)

CardLayout cardLayout=(CardLayout)(p.getMenuCard().getLayout());
cardLayout.show(p.getMenuCard(),"Card name");

我想调用 refresh() 方法,但我不知道如何在 CardLayout 中执行此操作。请帮忙。

4

2 回答 2

3

如果我们假设您的每个“卡片”面板都实现了定义refresh()方法的接口,那么您可以这样做:

interface Refreshable {
    void refresh();
}

class Card1 extends JPanel implements Refreshable {...}
...

// Changing the selected card panel
cardlayout.show(deckpanel, "card name");
for (component card: deckpanel.getComponents()) {
    ((Refreshable) card).refresh();
}

这是根据我对您的问题的理解。如果这不能回答您的问题,请随时编辑您的问题以进一步澄清。

于 2011-05-12T12:37:57.307 回答
1

我有一组按 CardLayout 排列的 JPanel。问题是,当我在一个 JPanel 中更改内容时,我希望这些更改反映在另一个 JPanel 中,该 JPanel 是同一套牌中的一张卡片。我在每个 JPanel 对象上定义了一个 refresh() 方法,但我不能使用用于移动卡片的语法来调用它们。(这里 p 是卡片组的容器卡片)

一件事(CardLayout 和交换 JPanels)与另一件事无关(一个类根据另一个类的状态更改状态)。您需要的是进行初始更改的类,以将此信息“推送”到应该响应更改的另一个类,通常是通过从第二个类调用 setter 方法。另一种选择是让第二类通过使用侦听器(可能是 PropertyChangeListener)从第一类“拉取”信息。但同样,这些解决方案——或任何解决方案——都与 CardLayout 或交换视图无关。

有关您当前情况的更具体建议,请考虑创建一个没有外部依赖项(图像、数据库等)的小型可编译和可运行应用程序,并展示您的问题,一个SSCCE,并将其发布在此处。

于 2011-05-12T12:42:10.640 回答