使用空列作为JTable中的分隔符

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

TablePanel.png http://sofzh.miximages.com/java/1zxpfkj.png

 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; } } } 

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

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

编辑:

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

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

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

我把两个答案结合起来:我使用了两个共享一个滚动条的表。 这适用于排序,它实际上使模型更简单。 标签无关紧要,但比较“A”和“B”的确如此。 我想我正试图解决“模型”中的“视图”问题。 我把它作为一个单独的答案,因为我很感激任何批评意见。

TablePanel http://sofzh.miximages.com/java/2uqdtmo.png

 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()); } 

不知道你想在这张表中显示什么,很难说你是否选择了好的解决方案。

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

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

请看一下这个问题的答案,给出了一些不错的新建议: JTable或JXTable中的列分隔符

Interesting Posts