【问题标题】:Fitting a JTable Inside a Panel在面板中安装 JTable
【发布时间】:2011-05-18 20:35:24
【问题描述】:

我正在使用 JTable 并将其添加到使用 gridbaglayout 的面板中,如下所示:

JTable qdbs = new JTable(rowData, columnNamesVector);
qdbs.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

panel.add(qdbs, c);

我不希望表格位于滚动窗格中,但我确实希望表格占据面板的整个宽度。我将如何做到这一点?

应要求提供 SSCCE:

import javax.swing.*;
import java.awt.*;

public class Main{

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

    public static class TestFrame extends JFrame{
    public TestFrame() {
        this.setTitle("SSCCE");

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

        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 0;

        c.insets = new Insets(10,10,10,10);
        JTable testTable = new JTable(10,2);
        panel.add(testTable, c);

        this.add(panel);
        this.pack();
        this.setVisible(true);
    }
    }

}

我希望这张桌子总是占据面板的整个宽度(除了插图)。目前,当框架调整大小时,表格不会改变大小。

【问题讨论】:

  • 您为什么要发布 SSCCE?你在一周前给出了一个工作示例。

标签: java swing jtable


【解决方案1】:

您需要添加约束来告诉布局如何处理更多空间。在您的 SSCCE 中添加以下项目:

  c.fill = GridBagConstraints.BOTH;
  c.weightx = 1;
  c.weighty = 0;

【讨论】:

    【解决方案2】:
    import java.awt.*;
    import javax.swing.*;
    
    public class Test
    {
        public static void main(String args[]) throws Exception
        {
            JPanel panel = new JPanel( new GridBagLayout() );
            JTable table = new JTable(5, 5);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            panel.add(table, gbc);
    
            JFrame frame = new JFrame();
            frame.add(panel, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    如果您需要更多帮助,请发布 SSCCE 来说明问题。

    【讨论】:

    • weightx 和 fill 解决了上述问题。我同意 mKorbel 的观点,即您永远不会真正想要放置没有关联 JScrollPane 的 JTable(JTable 严重依赖滚动来使某些行可见和其他操作)
    【解决方案3】:

    cGridBagConstraint 或类似的东西,我想?最简单的做法是将JPanelLayoutManager 设置为BorderLayout,然后添加约束BorderLayout.CENTER

    【讨论】:

    • 是的,但是我需要 JPanel 布局管理器是网格包布局,而不是边框​​布局。
    • @Alex:您可以嵌套 JPanel,每个 JPanel 都在嵌套布局中使用自己的布局管理器。如果 Ernest 的建议没有帮助,也许您最好的选择是创建一个小型的可编译和可运行的程序,我们都可以运行它来证明您的问题,SSCCE
    • @Alex Bliskovsky:GridBagLayout 很旧而且通常没有必要,只需使用 BorderLayout。
    【解决方案4】:

    Alex Bliskovsky 写道 panel.add(qdbs, c);

    错了,不,永远不要那样做,你忘了把JTable 包裹到ScrollPane 然后你可以玩一些LayoutManagers,有关LayoutManagers 的相关示例,请检查GridBagConstraints for GrigBagLayout

    【讨论】:

    • 我特别说过我不希望我的 JTable 位于滚动窗格内,并且我已经在使用 GridBagLayout。
    • @Alex Bliskovsky :-) 确保我看到了你的要求,但那是我的和平FullFace 反应,也许是另一个你...,但在这里 :-) 祝你好运
    【解决方案5】:

    在调整框架大小时,以下框架将正确调整表格大小。

    public class Sandbox {
    
    public static void main(String[] args) {
        new TestFrame();
    }
    
    public static class TestFrame extends JFrame {
        public TestFrame() {
            this.setTitle("SSCCE");
    
            JPanel panel = new JPanel();
            panel.setLayout(new GridBagLayout());
    
            GridBagConstraints c = new GridBagConstraints();
    
            c.gridx = 0;
            c.gridy = 0;
    
            c.insets = new Insets(10, 10, 10, 10);
            c.fill = GridBagConstraints.BOTH;
            c.weightx = 1;
            c.weighty = 1;
            JTable testTable = new JTable(10, 2);
            panel.add(testTable, c);
    
            this.add(panel);
            this.pack();
            this.setVisible(true);
        }
    }
    

    }

    【讨论】:

      【解决方案6】:

      也许:

      GridBagConstraints.fill = GridBagContraints.BOTH;
      

      【讨论】:

      • 这会专门填充宽度吗?它的默认高度很好,不应该改变。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多