假设我在JFrame中有一个JPanel。当我调用一个改变该JPanel的首选大小的方法时,它不会改变。
代码看起来像这样:
public class SomePanel extends JPanel{
public SomePanel(){
setPreferredSize( new Dimension( 390, 40 ) );
setBackground( Color.BLACK );
}
public void expand(){
setPreferredSize( new Dimension( 390, 200 ) );
}
public static void main( String args[] ){
JFrame frame = new JFrame();
frame.setSize( 450, 500 );
frame.setLayout( new FlowLayout() );
SomePanel somePanel = new SomePanel();
frame.add( somePanel );
frame.setVisible( true );
somePanel.expand();
}
}
我先要做些什么吗?我试过,所以在调用expand()时检查JPanel的大小。设置首选大小之前和之后JPanel的高度保持为40。
我也试过使用Dimension变量,但这也不起作用。
Dimension dimension;
public SomePanel(){
dimension = new Dimension( 390, 40 );
...
}
public expand(){
dimension.setSize( 390, 200 );
setPreferredSize( dimension );
}
答案 0 :(得分:3)
在frame.pack();
方法somePanel.expand();
之后添加main()
。它将完成。
答案 1 :(得分:3)
您需要invalidate
容器层次结构才能重新布局组件。
只需在您更改的组件上调用invalidate
,然后调用revalidate
。
这是一个小例子......
public class TestComponentHierarcy {
public static void main(String[] args) {
new TestComponentHierarcy();
}
public TestComponentHierarcy() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class Test extends JPanel {
private Dimension size = new Dimension(10, 10);
public Test() {
setLayout(new GridBagLayout());
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
size.width += 10;
size.height += 10;
invalidate();
revalidate();
}
});
}
@Override
public Dimension getPreferredSize() {
return size;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
}
}
}
答案 2 :(得分:2)
+1给所有人。
我通常使用以下组合:
revalidate()
和pack()
。 (see @GagandeepBali and @StanislavL answer here for more reasoning as to my choice of revalidate()
)和pack()
一样,这允许我的JFrame
大小适合内容。
请勿致电setPreferredSize
而是覆盖getPreferredSize
的{{1}}。
也不要在JPanel
上致电setSize(..)
,使用正确的JFrame
调整所有已添加的组件大小,而不是在设置{{1}之前调用LayoutManager
可见。
最后但并未强调在SwingUtilities.invokeXXX
block / Event Dispatch Thread
这是我做的一个例子:
基本上pack()
会覆盖JFrame
,并且方法JPanel
会更改getPreferredSize
实例中的变量,以便为setPanelSize(int w,int h)
返回新的JPanel
}。之后,我在Dimension
上致电getPreferredSize
和revalidate()
来重新选择更改:
pack()