1

target在 MainFraim 中有一个主 JPanel 和另一个currentView添加到target面板中的 JPanel。target面板包含带有侦听器的按钮。然后假设这些侦听器更改curretView面板的内容,如下所示:

private JPanel currentPanel;

public void setView(String type) {

    if (type.equals("overall")) {
        this.currentPanel = getOverallView();
        frame.setTitle("BookingCalendar - Overall View");
        frame.validate();
    } else if (type.equals("guest")) {
        this.currentPanel = getGuestView();
        frame.setTitle("BookingCalendar - Room View");
        frame.validate();
    } else if (type.equals("room")) {
        currentPanel.removeAll();
        this.currentPanel = getRoomView();
        frame.setTitle("BookingCalendar - Guest View");
        frame.validate();
    }
}

我调用的每个方法每次调用时都会返回新的 JPanel:

JPanel currentPanel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"))

问题是,每当我调用这些方法时,面板都不会改变。它始终保持不变(默认情况下getOverallView():)

我已经尝试在两个框架以及面板上进行无效、验证、重绘,但没有发生任何变化。有人可以详细说明我需要做什么才能完全改变面板的内容吗currentView

4

3 回答 3

5

您不应该每次都创建一个新的 JPanel()。而是为每种类型的视图创建一个,并使用CardLayout在它们之间切换。CardLayout 让您拥有像卡片一样被切换出来的 JPanel。

于 2012-05-21T14:32:13.543 回答
1

看起来您只是想四处移动指针,以currentView指向不同的面板。您实际需要做的是currentView从中删除target然后添加新面板。

如果这是您的 2 个面板...

JPanel target = new JPanel();
JPanel currentView = new JPanel();

然后你添加currentViewtarget类似的...

target.add(currentView);

然后要更改面板,您需要从 中删除现有面板target,然后添加新面板...

target.remove(currentPanel);
currentPanel = new JPanel();
target.add(currentPanel);
于 2012-05-21T14:33:29.713 回答
1

此外,如果您不想使用 CardLayout,您可以像您正在做的那样使 JPanel 成为新的 JPanel,然后调用 revalidate()。

于 2012-05-21T16:35:51.217 回答