我有一个源自JComponent
的自定义组件。我将其放入JScrollPane
并使用GridBagLayout
放入容器中。现在,如果容器太小,即必须开始显示滚动条,则该组件变为 tiny 。
以下示例在启动应用程序后呈现如下:
但是在稍微调整一下框架之后,就变成了这个:
以下是代码:
import java.awt.*;
import javax.swing.*;
class SO26736343 extends JPanel {
@Override public void paintComponent(Graphics g) {
g.setColor(Color.YELLOW);
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
public static void main(String[] args) {
JFrame frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frm.getContentPane();
cp.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
cp.add(new JButton("NW"), gbc);
cp.add(new JButton("N"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
cp.add(new JButton("NE"), gbc);
gbc.gridwidth = 1;
cp.add(new JButton("W"), gbc);
cp.add(new JScrollPane(new SO26736343()));
gbc.gridwidth = GridBagConstraints.REMAINDER;
cp.add(new JButton("E"), gbc);
gbc.gridwidth = 1;
cp.add(new JButton("SW"), gbc);
cp.add(new JButton("S"), gbc);
cp.add(new JButton("SE"), gbc);
frm.setSize(500, 500);
frm.setVisible(true);
}
}
我在OS X 10.8.5上使用Java 1.7.0_25执行了此操作。
我猜我的组件可能有问题,但我不知道是什么。布局是否应该尝试尽可能大地显示该组件,即使它无法以其首选大小显示?
答案 0 :(得分:4)
我认为您在添加自定义面板时忘记设置约束,因此行为无法预测(或至少意外):
gbc.gridwidth = 1;
cp.add(new JButton("W"), gbc);
cp.add(new JScrollPane(new SO26736343())); // gbc missing here
如果您希望此面板填充所有可用空间,请将weightx
和weighty
属性设置为大于0的值,并使用此约束添加面板:
gbc.weightx = 1;
gbc.weighty = 1;
cp.add(new JScrollPane(new SO26736343()), gbc);
答案 1 :(得分:0)
当我在Swing中使用文本字段时,会出现这种问题。我总是将问题组件的最小大小设置为其首选大小:
myComponent.setMinimumSize(myComponent.getPreferredSize());
您还可以设置重量并填写gbc。
////////////
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
////////////
当滚动条启动时,这会阻止折叠效果。最常见的是在文本区域和文本区域。
http://blue-walrus.com/2011/04/swing-textfieldtextarea-collapse-on-dialog-resize/