我正在尝试使用空列作为JTable
中列对之间的分隔符。这是我到目前为止的图片和代码。我知道我可以使用自定义TableCellRenderer
更改外观。在我走这条路之前,还有更好的方法吗?任何想法都赞赏。
TablePanel.png http://i42.tinypic.com/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;
}
}
}
答案 0 :(得分:8)
关于这种方法的问题,用户需要“切换”分隔符列。您可以使用Table Tabbing建议使其更加用户友好。
或者,如果两个表之间的标签不重要,那么也许你可以使用两个表并在两个表之间放置你想要的任何分隔符。如果需要,可以共享选择模型。
编辑:
正如我上面所建议的,共享模型比编写自定义侦听器更容易。为了使滚动保持同步,代码将是:
jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
您也可以对选择模型执行相同操作,以便突出显示行。
答案 1 :(得分:5)
我把两个答案结合起来:我使用了两个共享一个滚动条的表。这适用于排序,它实际上使模型更简单。 Tabbing无关紧要,但比较“A”和“B”的确如此。我想我试图解决“模型”中的“视图”问题。我把它作为一个单独的答案,因为我很欣赏任何批评意见。
TablePanel http://i41.tinypic.com/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());
}
答案 2 :(得分:2)
在不知道您希望在此表中显示什么内容的情况下,很难判断您是否选择了良好的解决方案。
关于这个解决方案。此列似乎不是分隔符。用灰色/其他颜色绘制它,或者用白色绘制分隔符标题单元格。
但无论如何我更喜欢JScrollPane +里面的两个表而不是这个解决方案。
答案 3 :(得分:1)
请看一下这个问题的答案,给出了一些不错的新建议:Column dividers in JTable or JXTable