0

当我调整 JFrame 的大小时,表格(或更具体地说是 scrollPane)会挤压成一个小矩形(保持不变,但高度更像 5-10 像素)。

我还注意到 JFrame 有一个特定的高度阈值,当 JFrame 的高度低于此阈值时,所有 GridBagLayouts 的行为都正确(例如,所有面板的正确宽度和高度)。当高度高于此阈值时,两个右侧面板都会获得额外的宽度,而当降低 JFrame 的高度时,rightTopPanel 比 rightBottomPanel 失去高度的速度要快得多。

当 rightTopPanel 获得最小高度(大约 5-10 像素)时,阈值似乎是点。

JPanel panel = new JPanel(new GridBagLayout());

JPanel rightTopPanel = new JPanel(new GridBagLayout());
panel.add(rightTopPanel, Helper.createGridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

tableModel = new DefaultTableModel(0, 2);
JTable table = new JTable(tableModel);

JScrollPane scrollPane = new JScrollPane(table);
rightBottomPanel.add(scrollPane);

panel.add(rightBottomPanel, Helper.createGridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel leftPanel = new JPanel();
panel.add(leftPanel, Helper.createGridBagConstraints(0, 0, 1, 2, 0.5, 1.0));

add(panel);

Helper.createGridBagConstraints 只是创建 GridBagConstraints 的辅助方法,具有许多“可选”参数。

GridBagConstraints createGridBagConstraints(int gridx, int gridy)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int fill)

编辑:这似乎是 JScrollPane 中的一个问题。如果我不添加它,剩余的面板会正确调整大小。

编辑2:因为,到目前为止,没有人明白我的问题是什么,这里是截图:http: //img155.imageshack.us/img155/8847/badgridbaglayout1.png

http://img17.imageshack.us/img17/8779/badgridbaglayout2.png

http://img28.imageshack.us/img28/9336/badgridbaglayout3.png

4

4 回答 4

3

表格(或更具体地说是 scrollPane)挤压成一个小矩形(保持不变,但高度更像 5-10 像素)。

AGridBagLayout将尝试以首选尺寸绘制组件。当框架缩小时,组件将被绘制为“最小尺寸”。所以有时组件的最小尺寸为 0,它只会显示为一个小矩形。

您可以尝试将滚动窗格的最小大小设置为等于首选大小,或者您可以使用您使用的约束来控制此行为。

阅读 Swing 教程中有关如何使用 GridBagLayout的部分以获取更多信息。

如果您仍然有问题,请发布您的SSCCE来证明问题。

于 2011-07-04T15:06:09.370 回答
1

尝试为 GridBagConstraints 指定 ipadx 和 ipady 值。

于 2011-07-04T12:43:12.987 回答
1

我创建了这个程序 -

package pkg;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestFrame extends JFrame {
    public TestFrame() {
        JPanel panel = new JPanel(new GridBagLayout());

        JPanel rightTopPanel = new JPanel(new GridBagLayout());
        panel.add(rightTopPanel, new GridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

        DefaultTableModel tableModel = new DefaultTableModel(0, 2);
        JTable table = new JTable(tableModel);

        JScrollPane scrollPane = new JScrollPane(table);
        rightBottomPanel.add(scrollPane);

        panel.add(rightBottomPanel, new GridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel leftPanel = new JPanel();
        panel.add(leftPanel, new GridBagConstraints(0, 0, 1, 2, 0.5, 1.0, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        add(panel);
        setSize(800, 600);
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestFrame();
    }
}

它似乎运作良好。您在 Help.createGridBagConstraints() 方法中添加了什么。似乎问题出在哪里。

于 2011-07-04T13:06:35.723 回答
1

唯一的解决方案是根本不使用任何布局并手动定位/调整组件大小,因为Swing 中的内置布局都没有正确实现。

于 2011-07-07T12:01:37.693 回答