如何设置JTable的宽度

Ste*_*a D 5 java swing jtable jscrollpane

我在JScrollPane中有一个JTable.我希望最小宽度大约为600宽表.我尝试在表格,滚动窗格和面板上设置最小尺寸.大小根本没有变化,我错过了什么?很难谷歌这一点,因为所有出现的是如何设置列的宽度.

在此输入图像描述

这是代码:

class SearchResults extends JPanel {

/**
 * Create the panel.
 */
public SearchResults() {
    setMinimumSize(new Dimension(640, 480));
    String[][] data= new String[][] {
            {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"},
            {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"}};
    String[] col = new String[] {
            "Last Name", "First Name", "Middle Initial", "Phone Number", "Email", "Project Title", "Project Description", "Amount", "Date Approved", "Date Completed", "College", "Faculty Mentor Name", "Co Grantee", "Major", "Travel Required", "Travel Purpose", "Travel Cost", "Travel Start Date", "Travel End Date", "View"};

      JTable table = new JTable(data,col);
      table.setMinimumSize(new Dimension(600,200));
      JTableHeader header = table.getTableHeader();
      JScrollPane pane = new JScrollPane(table);
      pane.setMinimumSize(new Dimension(600, 23));
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      add(pane);
}

}
Run Code Online (Sandbox Code Playgroud)

这是我将它添加到JFrame的地方:

public class Test extends JFrame
{

    public static void main(String[] args)
    {
        Test test = new Test();
        test.run();
    }

    public Test()
    {
        super("JAVA TEST!");
    }

    private void run()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SearchResults resultsPanel = new SearchResults();
        resultsPanel.setMinimumSize(new Dimension(600,200));
        add(resultsPanel);
        setSize(800,600);
        setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

kle*_*tra 10

有几个问题:

  • (正如我在评论中已经提到的)内部面板的FlowLayout总是将其子项调整为各自的prefSize
  • 表的最小/最大/最大宽度是根据各列大小的总和计算的
  • 一个表是一个Scrollable,因此发布它的preferredScrollableViewportSize(这是一个周围的JScrollPane用来计算自己的prefSize的大小)
  • prefScrollable的实现是......缺乏(温和地说),其硬编码为400 x 450(或类似)

相应地,有几个螺丝要调整(删除所有setXXSize调用:) :)

  • 使面板使用BorderLayout:如果调整框架大小,scrollPane将填充整个区域.
  • 扩展JTable以返回prefScrollableViewportSize的合理内容(fi以可见列/行的pref数量表示)

在代码中(并使用SwingX项目的JXTable,因为它已经有第二个api :-))

String[][] data= new String[][] {
        {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"},
        {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"}};
String[] col = new String[] {
        "Last Name", "First Name", "Middle Initial", "Phone Number", 
        "Email", "Project Title", "Project Description", "Amount", 
        "Date Approved", "Date Completed", "College", "Faculty Mentor Name", 
        "Co Grantee", "Major", "Travel Required", "Travel Purpose", 
        "Travel Cost", "Travel Start Date", "Travel End Date", "View"};

 JXTable table = new JXTable(data,col);
 table.setVisibleColumnCount(10);
 table.setHorizontalScrollEnabled(true);
 JScrollPane pane = new JScrollPane(table);
 JComponent comp = new JPanel(new BorderLayout());
 comp.add(pane);
Run Code Online (Sandbox Code Playgroud)

编辑

解决80%的要求(以及MigLayout的一点点预告:-))

// 80% with a minimum of 600 logical pixel:
MigLayout layout = new MigLayout("wrap 2, debug",
        "[600:pref, fill, grow][20%]");
JComponent comp = new JPanel(layout);
comp.add(pane, "spany");
comp.add(new JLabel("just something"));
Run Code Online (Sandbox Code Playgroud)