我已经全局初始化了一个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以及从另一种方法远程启动媒体允许我正在寻找的工作。
答案 0 :(得分:4)
您可以在容器上调用revalidate()
(如果它来自JComponent,例如JPanel),它使用布局让布局重新设置它们包含的组件。这应该通过此布局持有的所有容器递归,并且它们也应该更新其组件布局。我知道的主要例外是JScrollPanes中保存的组件,为此,您需要在滚动窗口的JViewport上调用revalidate。
此外,有时您需要在repaint()
之后致电revalidate()
,特别是如果您已移除容器所持有的任何组件。
答案 1 :(得分:3)
在您的示例中,您添加的按钮与前一个按钮的GridBagConstraints
完全相同。当我尝试运行该代码时,您的按钮会相互叠加,因此您只能看到其中一个。尝试更改GridBagConstraints
,以便您添加的第二个按钮放在另一个位置。建议练习为每个受约束的组件实例化一个新的GridBagConstraints
,以消除发生此类编程错误的可能性。
此外,关于您的更新,JFrame
没有revalidate()
功能。
如果你还没有这样做,那么值得你仔细阅读this。