0

我已经全局初始化了一个 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();//?

  }
}

更新 2:这似乎是 java 的传递值性质和我试图添加到我的布局中的另一个类(画布)的问题。如果我找到解决方案会更新。

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

编辑:我提供了代码作为参考,并尽量完整以提供完整的图片,不要轻易自行编译。感谢所有提供帮助的人。

更新4:成功!他们的关键是 mediaplayer 类做了一个“isDisplayable()”检查,如果它被添加到的框架没有被添加到 gridbaglayout,它会导致它挂起程序。一系列不幸的通过值传递(JInternalFrames),将内部框架预先添加到 gridbaglayout 和从另一种方法远程启动媒体允许我正在寻求工作。

4

2 回答 2

4

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

此外,有时您需要调用repaint()after revalidate(),尤其是在您删除了容器持有的任何组件时。

于 2011-09-07T16:35:47.123 回答
3

在您的示例中,您正在添加一个与前一个按钮完全相同的GridBagConstraints按钮。当我尝试运行该代码时,您的按钮被放置在彼此之上,因此您只会看到其中一个。尝试更改您的GridBagConstraints,以便您添加的第二个按钮放置在另一个位置。推荐的做法是GridBagConstraints为每个受约束的组件实例化一个新组件,以消除发生此类编程错误的机会。

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

如果您还没有这样做,那么值得您通读一遍。

于 2011-09-07T17:10:03.253 回答