GridBagLayout中的JScrollView中的组件绘制得太小

时间:2014-11-04 13:28:33

标签: java swing jscrollpane layout-manager gridbaglayout

我有一个源自JComponent的自定义组件。我将其放入JScrollPane并使用GridBagLayout放入容器中。现在,如果容器太小,即必须开始显示滚动条,则该组件变为 tiny

以下示例在启动应用程序后呈现如下:

Initial view

但是在稍微调整一下框架之后,就变成了这个:

Resized view

以下是代码:

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执行了此操作。

我猜我的组件可能有问题,但我不知道是什么。布局是否应该尝试尽可能大地显示该组件,即使它无法以其首选大小显示?

2 个答案:

答案 0 :(得分:4)

我认为您在添加自定义面板时忘记设置约束,因此行为无法预测(或至少意外):

    gbc.gridwidth = 1;
    cp.add(new JButton("W"), gbc);
    cp.add(new JScrollPane(new SO26736343())); // gbc missing here

如果您希望此面板填充所有可用空间,请将weightxweighty属性设置为大于0的值,并使用此约束添加面板:

    gbc.weightx = 1;
    gbc.weighty = 1;
    cp.add(new JScrollPane(new SO26736343()), gbc);

截图

Normal

Shrunken

答案 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/