java - JTable 大于 JFrame

标签 java swing jtable

编辑:抱歉进行了许多编辑。我自己都忘记写了什么了。

我使用 JPanel,将 BoxLayout 作为 JFrame 的根面板。我向此根面板添加了另外两个面板:带有 FlowLayou 的 ButtonPanel 和 tabbedPane。每个选项卡式 Pane 都是通过按顶部的第二个按钮动态创建的。 tabbedPane 中有一个带有 BoxLayout 的 templatePanel,其中包含其他三个通用 JPanel:带有 FlowLayout 的复选框面板、带有 BorderLayout 的 tablePanel 和另一个带有 BoxLayout 的 tablePanel。

我使用 BoderLayout.CENTER 将 JTable 添加到 tablePanel 中,运行程序后 JTable 垂直太大,我需要调整框架大小。我需要动态添加行,因此我使用自定义 DefaultTableModel 创建一个空 JTable(我重载了 isCellEditable 方法,仅此而已),然后通过检查复选框我用数据填充它。 JTable 也比它设计容纳的最大行数太大。 我的意思是说: enter image description here 我怎样才能缩小它?

我通过类的构造函数(扩展 JPanel)创建 templatePanel,只需 add.(templatePanel)

代码:

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);
}

最佳答案

基本逻辑应该是:

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

这将消除多余的垂直空间。

关于java - JTable 大于 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511875/

相关文章:

java - Ajax 函数始终返回 0 并且不会继续进行

java - 我可以在一个 JFrame 上设置两种不同的外观和字段吗?

java - 添加的按钮不可见

java - headless 画

java - 从列表中选择一个元素

java - 如何在 JTable 单元格中居中一个值?

java - 当用户选择该选项时如何输出目录元哈希值?

java - 如何在java中制作流畅的动画而不是口吃

java - 在 JTree 中显示 JTable 的行为不同,具有不同的外观和感觉

java - 没有索引声明的 for 循环