7

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

}

这里是我将它添加到 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);
    }
}
4

3 回答 3

12

有几个问题:

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

因此,有几个螺丝需要调整(在删除所有 setXXSize 调用之后:))

  • 使面板使用 BorderLayout:如果调整框架大小,scrollPane 将填充整个区域。
  • 扩展 JTable 以返回一些对 prefScrollableViewportSize 合理的东西(根据可见列/行的 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);

编辑

解决 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"));
于 2012-11-07T18:43:34.147 回答
0

这东西也有一些问题。使用setPreferedSize(new Dimension(800,600));也。这可以解决你的问题

于 2012-11-07T18:11:02.113 回答
0

布局很重要。像NetbeansEclipse这样的 IDE通过拖放提供免提布局设计。

一旦您了解Swing 布局,您甚至可以通过代码来实现。我在这里提到的几个最常用的布局

BorderLayout
BoxLayout
FlowLayout
GridLayout

在您的中,如果您添加panel.setLayout( new GridLayout(1,1));,表格将在框架内固定。

此外,您无需扩展JPanelJFrame除非您覆盖某些内容或向框架添加更多内容。实践学习。

于 2012-11-07T18:42:35.043 回答