是的,这看起来像是一个重复的问题,但请耐心等待。采取以下代码,功能正常:
private void setMainLayout(Container pane) {
String imagePath = Start.getProperty("IMAGE_DIR");
characters.add(char1); // pseudocode
characters.add(char2);
characters.add(char3);
characters.add(char4);
// "CharacterDisplay.getMainLayout()" returns a Box object:
for (CharacterDisplay character : characters)
character.getMainLayout().setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.WHITE));
// "mainFrame" is a JFrame:
mainFrame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
/* do random gridbagconstraints stuff */
pane.add(characters.get(0).getMainLayout(), gbc);
/* do random gridbagconstraints stuff */
// "nonCharacterArea" is a JPanel:
nonCharacterArea.setOpaque(true);
nonCharacterArea.setBackground(Color.BLACK);
nonCharacterArea.setLayout(new GridBagLayout());
GridBagConstraints constCenter = new GridBagConstraints();
/* do random gridbagconstraints stuff */
nonCharacterArea.add(actionPane, constCenter); // actionPane is a kind of JPanel
/* do random gridbagconstraints stuff */
nonCharacterArea.add(menuPane, constCenter); // menuPane is a kind of JPanel
pane.add(nonCharacterArea, gbc);
/* do random gridbagconstraints stuff */
pane.add(characters.get(1).getMainLayout(), gbc);
gbc.gridx = 0;
gbc.gridy = 2;
pane.add(characters.get(2).getMainLayout(), gbc);
gbc.gridx = 2;
gbc.gridy = 2;
pane.add(characters.get(3).getMainLayout(), gbc);
} // setMainLayout
我希望能够在执行期间动态更改actionPane
对象。完成此任务的最佳方法是什么?我专门编写了这个伪代码块,以表明它不像人们在类似问题中发布的其他示例那么简单 - 因为它基于JPanel在屏幕上某个位置的精确放置,以及此setMainLayout每次我只想更改actionPane对象时,不应该调用()方法。
有时它会是一个横向滚动的屏幕,有时它会是一个商店界面,它可能是很多种不同的东西。
想法?感谢。
答案 0 :(得分:4)
如果actionPane
取自几乎预先定义的一小组面板,并且具有相对较小的实时更新和更改,一个很好的选择是使用CardLayout,并在预定义之间切换actionPanes根据需要。
如果actionPane是非常动态的,你真的无法提前预测它可能是什么,那么@Greg Kopff有一个合理的答案。
答案 1 :(得分:3)
不要添加和删除actionPane
- 保留原样,但将子组件添加/删除到actionPane
。然后,此任务变得相对微不足道,因为actionPane
仅包含单个组件。