java - 无法通过拖动调整 JTable 列的大小

标签 java swing resize jtable

长话短说,我正在制作一个自定义 Swing 组件,它基本上是一个侧面带有面板的 JTable。该表当然应该是可滚动的并且有一个表头,但是因为我只希望表头位于实际 JTable 之上而不是侧面板之上,所以我不得不采取一些技巧来使其工作。但是那部分工作正常。

但是,在这个过程中,我设法破坏了 JTableHeader 的鼠标拖动列大小调整功能。我完全不知道为什么以及我能做些什么。

下面是一个最小的工作示例来说明我的问题。

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.Scrollable;
import javax.swing.table.JTableHeader;


final class FooTable extends JPanel implements Scrollable {

    public FooTable() {
        initComponents();
    }

    // Generated by NetBeans IDE
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        sidePanel = new javax.swing.JPanel();
        table = new javax.swing.JTable();

        setLayout(new java.awt.GridBagLayout());

        sidePanel.setMinimumSize(new java.awt.Dimension(70, 0));
        sidePanel.setPreferredSize(new java.awt.Dimension(70, 0));
        sidePanel.setLayout(null);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weighty = 1.0;
        add(sidePanel, gridBagConstraints);

        table.setFont(table.getFont().deriveFont(table.getFont().getSize()+1f));
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"1", "A", "I", "-"},
                {"2", "B", "II", "--"},
                {"3", "C", "III", "---"},
                {"4", "D", "IV", "----"},
                {"5", "E", "V", "-----"},
                {"6", "F", "VI", "------"},
                {"7", "G", "VII", "-------"},
                {"8", "H", "VIII", "--------"},
                {"9", "I", "IX", "---------"},
                {"10", "J", "X", "----------"}
            },
            new String [] {
                "Column 1", "Column 2", "Column 3", "Column 4"
            }
        ));
        table.setRowHeight(24);
        table.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 1.0;
        add(table, gridBagConstraints);
    }// </editor-fold>

    public JScrollPane createScrollView() {
        JScrollPane jsp = new JScrollPane(this);
        JViewport jvp = new JViewport();
        final JTableHeader th = new JTableHeader();

        th.setTable(table);
        th.setColumnModel(table.getColumnModel());
        th.setResizingAllowed(true);

        jvp.setView(new JPanel() {

            {
                setLayout(null);
                add(th);

                th.setLocation(70, 0);

                FooTable.this.addComponentListener(new ComponentAdapter() {

                    @Override
                    public void componentResized(ComponentEvent e) {
                        th.setSize(FooTable.this.getWidth(), th.getPreferredSize().height);
                    }
                });
                setPreferredSize(new Dimension(th.getPreferredSize().width, th.getPreferredSize().height));
            }
        });
        jsp.setColumnHeader(jvp);
        return jsp;
    }

    // Variables declaration - do not modify
    private javax.swing.JPanel sidePanel;
    private javax.swing.JTable table;
    // End of variables declaration


    //
    // Scrollable implementation
    //
    public Dimension getPreferredScrollableViewportSize() {
        Dimension d = new Dimension();
        d.width = sidePanel.getPreferredSize().width + table.getPreferredSize().width;
        d.height = sidePanel.getPreferredSize().height + table.getPreferredSize().height;
        return d;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return table.getScrollableUnitIncrement(visibleRect, orientation, direction);
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return table.getScrollableBlockIncrement(visibleRect, orientation, direction);
    }

    public boolean getScrollableTracksViewportWidth() {
        return table.getScrollableTracksViewportWidth();
    }

    public boolean getScrollableTracksViewportHeight() {
        return table.getScrollableTracksViewportHeight();
    }

    //
    // Test program
    //
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        FooTable fooTable = new FooTable();
        f.add(fooTable.createScrollView());
        f.pack();
        f.setVisible(true);
    }

}

最佳答案

我认为你缺少的也是告诉 JTable关于JTableHeader .在 createScrollView 方法中,尝试在返回之前添加以下内容:

    table.setTableHeader(th);

关于java - 无法通过拖动调整 JTable 列的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2499406/

相关文章:

java - 当每个元素上的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定

java - 尝试使用子文本字段在 JPanel 上设置边框

java - 扩展类 JLabel 以添加属性拖动的问题

java - GWT:是否可以在添加下一个子项之前但在 CSS 规则应用于该子项之后检查父项大小?

android - 使用 Glide 保存调整大小的图像

java - 使用 GridLayout 时,我可以将组件添加到特定的网格单元格吗?

java - 添加外部 jar 时出错

swift - iOS8 Swift - 动态调整 tableview 单元格大小的问题

java - 如何仅使用构造函数的部分参数? ( java )

java - 如何在Java中的JTextArea中追加数据?