Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable在容器大小更改时仅调整选定列的大小_Java_Swing_Resize_Jtable - Fatal编程技术网

Java JTable在容器大小更改时仅调整选定列的大小

Java JTable在容器大小更改时仅调整选定列的大小,java,swing,resize,jtable,Java,Swing,Resize,Jtable,对于位于面板内的JTable,如果面板变大,我如何将额外空间分配给特定列(在我的情况下,分配给最后一列,尽管提供“第3、4和8列将获得额外空间”可能会更好) 我想允许用户手动更改所有列的列大小 我尝试了table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 当调整JTable的大小时,会将额外的空间分配给所有可调整大小的列。在JavaDoc for JTable,for doLayout()中,表示: 当由于调整封闭窗口的大小而调用该方法

对于位于面板内的JTable,如果面板变大,我如何将额外空间分配给特定列(在我的情况下,分配给最后一列,尽管提供“第3、4和8列将获得额外空间”可能会更好)

我想允许用户手动更改所有列的列大小

我尝试了table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 当调整JTable的大小时,会将额外的空间分配给所有可调整大小的列。在JavaDoc for JTable,for doLayout()中,表示:

当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小已在JTable的“外部”进行,并且无论该JTable的自动调整大小模式如何,更改或“增量”都应分布到所有列

也许有一种方法可以拦截“JTable正在调整大小”事件,并执行一些自定义操作,尽管我还没有弄清楚

另一种解决方案如所示 虽然它并没有真正告诉我如何在swing中使用它。

  • 请参阅常数
    表。setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

  • 默认宽度为80px

  • 可以准备初始大小,更多信息请参见Oracle教程

      • 请参阅常数
        表。setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

      • 默认宽度为80px

      • 可以准备初始大小,更多信息请参见Oracle教程


      覆盖
      doLayout()
      方法以截取布局。这提供了基本信息。您需要确定在最后一列宽度即将变为负值时要执行的操作

      import javax.swing.*;
      import javax.swing.table.*;
      
      public class Test2Table
      {
          private static Object[][] data = new Object[][]
          {
                  { "a", "b", "c" },
                  { "d", "e", "f" }
          };
          private static Object[] colNames = new Object[] { "1", "2", "3" };
      
          public static void main(String[] args)
          {
              SwingUtilities.invokeLater(new Runnable()
              {
                  @Override
                  public void run() {
                      JTable table = new JTable(data, colNames)
                      {
                          @Override
                          public void doLayout()
                          {
                              //  Viewport size changed. Change last column width
      
                              if (tableHeader != null
                              &&  tableHeader.getResizingColumn() == null)
                              {
                                  TableColumnModel tcm = getColumnModel();
                                  int delta = getParent().getWidth() - tcm.getTotalColumnWidth();
                                  TableColumn last = tcm.getColumn(tcm.getColumnCount() - 1);
                                  last.setPreferredWidth(last.getPreferredWidth() + delta);
                                  last.setWidth(last.getPreferredWidth());
                              }
                              else
                              {
                                  super.doLayout();
                              }
                          }
      
                      };
      
                      JFrame frame = new JFrame();
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.add(new JScrollPane(table));
                      frame.pack();
                      frame.setVisible(true);
                  }
              });
          }
      }
      

      覆盖
      doLayout()
      方法以截取布局。这将提供基本信息。您需要确定在最后一列宽度即将变为负值时要执行的操作

      import javax.swing.*;
      import javax.swing.table.*;
      
      public class Test2Table
      {
          private static Object[][] data = new Object[][]
          {
                  { "a", "b", "c" },
                  { "d", "e", "f" }
          };
          private static Object[] colNames = new Object[] { "1", "2", "3" };
      
          public static void main(String[] args)
          {
              SwingUtilities.invokeLater(new Runnable()
              {
                  @Override
                  public void run() {
                      JTable table = new JTable(data, colNames)
                      {
                          @Override
                          public void doLayout()
                          {
                              //  Viewport size changed. Change last column width
      
                              if (tableHeader != null
                              &&  tableHeader.getResizingColumn() == null)
                              {
                                  TableColumnModel tcm = getColumnModel();
                                  int delta = getParent().getWidth() - tcm.getTotalColumnWidth();
                                  TableColumn last = tcm.getColumn(tcm.getColumnCount() - 1);
                                  last.setPreferredWidth(last.getPreferredWidth() + delta);
                                  last.setWidth(last.getPreferredWidth());
                              }
                              else
                              {
                                  super.doLayout();
                              }
                          }
      
                      };
      
                      JFrame frame = new JFrame();
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.add(new JScrollPane(table));
                      frame.pack();
                      frame.setVisible(true);
                  }
              });
          }
      }
      

      这是非常有用的,谢谢。使用此解决方案,它为最后一列提供了所有额外的“空闲”空间,忽略了每列的“首选”大小,特别是在列的初始显示上。我也想包括mKorbel的方法:如果可能,遵循首选宽度(仅在表的初始显示上需要?),并在调整表容器的大小时将所有空闲时间分配到最后一列。我提出了一些(不完整的)技巧。有没有简单/优雅的解决方案?也发现了哪些有用(请参阅doLayout()部分),但如果不需要的话,我不想重新设计整个轮子。
      如果可能的话,我想使用首选宽度(仅在表格的初始显示时需要?)
      -这就是代码的工作方式。将上面的示例更改为使用setSize(400200),而不是使用pack()。前两列以其首选宽度75显示,剩余空间将显示到第三列。这非常有用,谢谢。使用此解决方案,它将所有额外的“空闲”空间显示到最后一列,而忽略“首选”列“每个列的大小,特别是在列的初始显示上。我还想介绍一下mKorbel的方法:如果可能的话,遵循首选宽度(仅在表格的初始显示时需要),并在调整表格容器的大小时将所有松弛部分分配到最后一列。我想出了一些(不完整的)技巧。有没有简单/优雅的解决方案?也找到了有用的解决方案(请参阅doLayout()一节),但如果没有必要的话,我不想重新设计整个轮子。
      如果可能的话,我想尊重首选的宽度(仅在表格的初始显示时需要)
      -这就是代码的工作方式。将上述示例更改为使用setSize(400200),而不是使用pack()。前两列以其首选宽度75显示,剩余空间用于第三列。