将JPanel更改为另一个JPanel不会重新绘制更改

时间:2012-05-21 14:27:54

标签: java swing jframe jpanel

我在MainFraim中有一个主要的JPanel target和另一个currentView JPanel,它被添加到target面板中。 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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

看起来你只是试图移动指针,使currentView指向另一个面板。您实际需要做的是从currentView中删除target,然后添加新面板。

如果这是你的2个小组...

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

并将currentView添加到target,就像这样......

target.add(currentView);

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

target.remove(currentPanel);
currentPanel = new JPanel();
target.add(currentPanel);

答案 2 :(得分:1)

此外,如果您不想使用CardLayout,您可以像往常一样使JPanel成为新的JPanel,只需调用revalidate()。