JTable大于JFrame

时间:2016-02-19 18:03:24

标签: java swing jtable

编辑:很抱歉有很多修改。我忘记了自己写的东西。

我使用具有BoxLayout的JPanel作为JFrame的根面板。我正在向这个根面板添加另外两个面板:带有FlowLayou和tabbedPane的buttonPanel。每个选项卡式窗格都是通过按顶部的第二个按钮动态创建的。在tabbedPane中有一个带有BoxLayout的templatePanel,其中包含三个其他常规JPanel:Checkboxes面板与FlowLayout,tablePanel与BorderLayout,另一个与BoxLayout。

我正在使用BoderLayout.CENTER将JTable添加到tablePanel,并且在运行程序之后,JTable的位置太大,我需要调整帧大小。我需要动态添加行,所以我使用自定义DefaultTableModel创建了一个空的JTable(我重载了isCellEditable方法,仅此而已),然后通过选中复选框我用数据填充它。 JTable也比它设计的最大行数大得多。 我的意思是说: enter image description here 我怎么能缩小它?

我用add.(templatePanel)

创建带有类构造函数的templatePanel(扩展JPanel)

代码:

public TemplatePanel()
{
    model = new DefaultTableModel(new Object[][] {}, new String[]
            {"<html>...</html>", "<html>...</html>",
                    "...", "...", "<html>...</html>",
                    "<html>...</html>", "...", "...",
                    "<html>...</html>"})
    {
        @Override
        public boolean isCellEditable(int row, int column)
        {
            return column == 1 || column == 3;
        }
    };

    templatePanel = new JPanel();
    tablePanel = new JPanel();

    templatePanel.setLayout(new BoxLayout(templatePanel, BoxLayout.PAGE_AXIS));
    tablePanel.setLayout(new BorderLayout());

    checkBoxPanel = new JPanel();

    checkBoxPanel.setLayout(new FlowLayout());

    1 = new JCheckBox("...");
    2 = new JCheckBox("...");
    3 = new JCheckBox("...");
    4 = new JCheckBox("...");
    5 = new JCheckBox("...");
    6 = new JCheckBox("...");

    checkBoxPanel.add(1);
    checkBoxPanel.add(2);
    checkBoxPanel.add(3);
    checkBoxPanel.add(4);
    checkBoxPanel.add(5);
    checkBoxPanel.add(6);

    1.addItemListener(this);
    2.addItemListener(this);
    3.addItemListener(this);
    4.addItemListener(this);
    5.addItemListener(this);
    6.addItemListener(this);

    table = new JTable(model);
    scrollPane = new JScrollPane(table);

    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    table.setTableHeader(new JTableHeader(table.getColumnModel())
    {
        @Override
        public Dimension getPreferredSize()
        {
            Dimension d = super.getPreferredSize();
            d.height = 50;
            return d;
        }
    });

    TableColumn firstColumn = table.getColumnModel().getColumn(0);
    TableColumn secondColumn = table.getColumnModel().getColumn(1);
    TableColumn thirdColumn = table.getColumnModel().getColumn(2);
    TableColumn ninthColumn = table.getColumnModel().getColumn(8);

    firstColumn.setPreferredWidth(170);
    secondColumn.setPreferredWidth(50);
    thirdColumn.setPreferredWidth(30);
    ninthColumn.setPreferredWidth(100);
    table.setRowHeight(30);

    tablePanel.add(scrollPane, BorderLayout.NORTH);

    templatePanel.add(checkBoxPanel);
    templatePanel.add(tablePanel);
    add(templatePanel);
}

2 个答案:

答案 0 :(得分:3)

基本逻辑应该是:

JTable table = new JTable(model);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );

这将消除额外的垂直空间。

答案 1 :(得分:1)

如果我理解正确,您希望表格的框架更小吗?那是对的吗?如果您正在使用BorderLayout,则中心将覆盖整个帧,除非您在基本方向上添加内容。创建一个框并将其添加到SOUTH以在底部和桌子之间创建缓冲。 再说一次,如果我没有正确理解这一点,我会道歉。

编辑:

您是否尝试在滚动窗格上使用setPreferredSize(new Dimension(800,500))?