【问题标题】:Using an empty column as a divider in a JTable在 JTable 中使用空列作为分隔符
【发布时间】:2010-04-10 18:33:32
【问题描述】:

我正在尝试使用一个空列作为JTable 中的列对之间的分隔符。这是我到目前为止所拥有的图片和代码。我知道我可以使用自定义 TableCellRenderer 更改外观。在我走这条路之前,有没有更好的方法来做到这一点?任何想法表示赞赏。

import javax.swing.*;
import javax.swing.table.*;

public class TablePanel extends JPanel {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("TablePanel");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.add(new TablePanel());
                f.pack();
                f.setVisible(true);
            }
        });
    }

    public TablePanel() {
        TableModel dataModel = new MyModel();
        JTable table = new JTable(dataModel);
        table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0);
        JScrollPane jsp = new JScrollPane(table);
        jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        this.add(jsp);
    }

    private static class MyModel extends AbstractTableModel {

        private static final int DIVIDER = 2;
        private final String[] names = { "A1", "A2", "", "B1", "B2" };

        @Override
        public int getRowCount() {
            return 32;
        }

        @Override
        public int getColumnCount() {
            return names.length;
        }

        @Override
        public String getColumnName(int col) {
            if (col == DIVIDER) return "";
            return names[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            if (col == DIVIDER) return "";
            return (row + 1) / 10.0;
        }

        @Override
        public Class<?> getColumnClass(int col) {
            if (col == DIVIDER) return String.class;
            return Number.class;
        }
    }
}

【问题讨论】:

    标签: java swing jtable divider


    【解决方案1】:

    关于这种方法的问题,用户需要“制表符”分隔列。您可以使用Table Tabbing 建议使其更加用户友好。

    或者如果两个表之间的制表符不重要,那么也许您可以使用两个表并在两者之间放置您想要的任何分隔符。如果需要,可以共享选择模型。

    编辑:

    正如我上面建议的那样,共享模型比编写自定义侦听器更容易。为了保持滚动同步,代码将是:

    jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
    

    您也可以对选择模型执行相同操作,以便同步突出显示行。

    【讨论】:

    • +1 感谢您提醒我有关选项卡的信息。这并不重要,但这篇文章很好。我的空列想法也让排序成为问题。
    • 哦,就是这个意思!我在下面改了。谢谢。
    【解决方案2】:

    我将这两个答案结合起来:我使用了两个共享滚动条的表格。这适用于排序,它实际上使模型更简单。分页无关紧要,但比较“A”和“B”却很重要。我想我试图解决“模型”中的“视图”问题。我将此作为单独的答案,因为我会感谢任何关键的 cmets。

    public TablePanel() {
        this.setLayout(new GridLayout(1, 0, 8, 0));
    
        JTable tableA = new JTable(new MyModel("A"));
        tableA.setPreferredScrollableViewportSize(new Dimension(200, 400));
        final JScrollPane jspA = new JScrollPane(tableA);
        jspA.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        this.add(jspA);
    
        JTable tableB = new JTable(new MyModel("B"));
        tableB.setPreferredScrollableViewportSize(new Dimension(200, 400));
        final JScrollPane jspB = new JScrollPane(tableB);
        jspB.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        this.add(jspB);
    
        tableA.setSelectionModel(tableB.getSelectionModel());
        jspA.getVerticalScrollBar().setModel(jspB.getVerticalScrollBar().getModel());
    }
    

    【讨论】:

      【解决方案3】:

      如果不知道您想在此表中显示什么,就很难判断您是否选择了好的解决方案。

      关于这个解决方案。此列似乎不像分隔线。用灰色/其他颜色绘制它,或者用白色绘制分隔标题单元格。

      但无论如何,我更喜欢 JScrollPane + 里面的两个表格,而不是这个解决方案。

      【讨论】:

        【解决方案4】:

        请看一下这个问题的答案,那里给出了一些不错的新建议:Column dividers in JTable or JXTable

        【讨论】:

        • 事实证明,这不是我想要的,但可能对登陆这里的其他人有用。 +1
        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 2015-01-06
        相关资源
        最近更新 更多