相关疑难解决方法(0)

仅当JTable适合视口时才启用JTable的自动调整大小

我需要在JScrollPane中创建一个带有可调整大小的列的JTable(当用户增加列宽时 - 出现水平滚动条).为此,我有用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);.此外,当视口宽度足以包含整个表格时 - 列应该拉伸以填充视口宽度.为了实现这一点,我有getScrollableTracksViewportWidth()JTable类的覆盖方法如下:

@Override
public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
}
Run Code Online (Sandbox Code Playgroud)

这种方法很有效,除了一件事:当我第一次尝试调整列的大小时,它返回自己的宽度以开始位置.如果我快速调整列大小并释放鼠标表继续工作正常.那么,这种行为的原因是什么?为什么表尝试调整大小,即使getScrollableTracksViewportWidth()返回false?或者,也许,你可以提出更好的解决方案来实现这样的调整大小模式?

贝娄是上述问题的简单工作示例:

import javax.swing.*;

public class TestTable {
    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) …
Run Code Online (Sandbox Code Playgroud)

java swing jtable preferredsize jviewport

13
推荐指数
1
解决办法
5235
查看次数

JTable具有自动调整大小,水平滚动和可收缩的第一列

我在使用滚动条创建JTable时遇到问题.我想要一个有2列且没有可见滚动条的JTable.

如果我放大其中一列,则滚动条应该变为可见,并且列会调整大小.

我按照这个答案如何使JTable同时AutoResize和horizo​​ntall可滚动?并且工作正常,基本上归结为:

JTable table = new JTable() {
  @Override
  public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
  }
};
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
Run Code Online (Sandbox Code Playgroud)

但是,使用此解决方案,我无法收缩第一列.只有当我放大第二列并且滚动条变得可见时,我才能缩小第一列.

所需的行为是2列可自动调整大小.这意味着1列可以缩小,然后在没有滚动条弹出的情况下延伸.仅当扩展其中一列时,视图应该延伸,才会弹出滚动条.

场景:

  1. 缩小第1列 - >第2列放大,没有滚动条
  2. 放大第一列 - >第二列收缩,仍然没有滚动条
  3. 放大第二列 - > 1列保持不变,第二列放大并显示滚动条

有关修复此问题的任何想法

SSCCE:

import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.Container;

public class TableTest {
public TableTest() {

JDialog mainDialog = new JDialog();
mainDialog.setResizable( true );
mainDialog.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
Container contentPane = mainDialog.getContentPane();

JTable myTable = new …
Run Code Online (Sandbox Code Playgroud)

java swing jtable jscrollpane

5
推荐指数
1
解决办法
8065
查看次数

标签 统计

java ×2

jtable ×2

swing ×2

jscrollpane ×1

jviewport ×1

preferredsize ×1