更新java布局管理器

时间:2011-09-07 16:33:32

标签: java swing layout layout-manager gridbaglayout

我已经全局初始化了一个GridBagLayout,然后在我的类构造函数中实例化了它并添加了一些按钮等。

事后我怎么能添加东西呢?简单类扩展了JFrame。每当我尝试class.add(stuff,gridbagconstraints)之后(在构造函数中使用add(stuff,gribagconstraints))没有任何反应,并且没有任何内容添加到我的布局中。

我是否需要“刷新”布局管理器或其他什么?它在全球范围内宣布。

更新:我已经尝试了revalidate()但它似乎没有工作,这是我的代码的简化版本,其中有一个测试按钮用于概念验证:

public class MainGUI extends JPanel{
    static GridBagConstraints c;
    static MainGUI mainGUIclass;
    static JFrame mainGUIframe;

    public MainGUI() {
    this.setLayout(new GridBagLayout());
    c = new GridBagConstraints();

    saveButton = new JButton("Save and Exit");
    saveButton.setPreferredSize(new Dimension(200, 30));

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    add(saveButton, c);
    }

public static void main(String[] args) {
    mainGUIframe = new JFrame("Message");

    mainGUIframe.setSize(800,800);

    mainGUIclass = new MainGUI();

    mainGUIframe.add(mainGUIclass);
    mainGUIframe.setVisible(true);


   //now the addition
    JButton newButton = new JButton("New Button");  

    newButton.setPreferredSize(new Dimension(200, 30));


    c.gridx = 5;
    c.gridy = 0;
    c.gridwidth = 4;
    mainGUIclass.add(newButton,c);

    //none of this seems to work
    mainGUIclass.revalidate();//?
    mainGUIclass.repaint();//?

  }
}

Update2:这似乎是java的passbyvalue性质和我试图添加到我的布局的另一个类(canvas)的问题。如果我找到解决方案,将会更新。

Update3:这是一个线程问题,我正在调用的类挂着主窗口。

编辑:我提供了代码作为参考,并试图完整提供完整的图片,而不是自己编译。感谢所有提供帮助的人。

Update4:成功!关键是媒体播放器类执行了“isDisplayable()”检查,如果添加的帧没有添加到gridbaglayout,它会导致程序挂起。一系列令人遗憾的传递值(JInternalFrames),将内部框架添加到gridbaglayout以及从另一种方法远程启动媒体允许我正在寻找的工作。

2 个答案:

答案 0 :(得分:4)

您可以在容器上调用revalidate()(如果它来自JComponent,例如JPanel),它使用布局让布局重新设置它们包含的组件。这应该通过此布局持有的所有容器递归,并且它们也应该更新其组件布局。我知道的主要例外是JScrollPanes中保存的组件,为此,您需要在滚动窗口的JViewport上调用revalidate。

此外,有时您需要在repaint()之后致电revalidate(),特别是如果您已移除容器所持有的任何组件。

答案 1 :(得分:3)

在您的示例中,您添加的按钮与前一个按钮的GridBagConstraints完全相同。当我尝试运行该代码时,您的按钮会相互叠加,因此您只能看到其中一个。尝试更改GridBagConstraints,以便您添加的第二个按钮放在另一个位置。建议练习为每个受约束的组件实例化一个新的GridBagConstraints,以消除发生此类编程错误的可能性。

此外,关于您的更新,JFrame没有revalidate()功能。

如果你还没有这样做,那么值得你仔细阅读this