Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JTable中使用空列作为分隔符_Java_Swing_Jtable_Divider - Fatal编程技术网

Java 在JTable中使用空列作为分隔符

Java 在JTable中使用空列作为分隔符,java,swing,jtable,divider,Java,Swing,Jtable,Divider,我正在尝试使用空列作为JTable中成对列之间的分隔符。这是我到目前为止的图片和代码。我知道我可以使用自定义的TableCellRenderer更改外观。在我走那条路之前,有没有更好的方法?任何想法都值得赞赏 import javax.swing.*; 导入javax.swing.table.*; 公共类TablePanel扩展了JPanel{ 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 公开募

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

import javax.swing.*;
导入javax.swing.table.*;
公共类TablePanel扩展了JPanel{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新JFrame(“桌面面板”);
f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f、 添加(新的TablePanel());
f、 包装();
f、 setVisible(真);
}
});
}
公共事务委员会(){
TableModel dataModel=新的MyModel();
JTable table=新的JTable(数据模型);
table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0);
JScrollPane jsp=新的JScrollPane(表);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS);
add(jsp);
}
私有静态类MyModel扩展了AbstractTableModel{
专用静态最终整数除法器=2;
私有最终字符串[]名称={“A1”、“A2”、“1”、“B1”、“B2”};
@凌驾
public int getRowCount(){
返回32;
}
@凌驾
public int getColumnCount(){
返回name.length;
}
@凌驾
公共字符串getColumnName(int-col){
如果(col==除法器)返回“”;
返回名称[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
如果(col==除法器)返回“”;
返回(行+1)/10.0;
}
@凌驾
公共类getColumnClass(int-col){
if(col==分隔符)返回String.class;
返回编号.class;
}
}
}

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

关于这个解决方案。此列看起来不像分隔符。用灰色/其他颜色绘制,或用白色绘制分隔符标题单元格


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

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

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

编辑:

如上所述,共享模型比编写自定义侦听器更容易。要保持滚动同步,代码应为:

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

您也可以对选择模型执行相同的操作,以便行的高亮显示是同步的。

我将两种答案结合在一起:我使用了两个共享滚动条的表。这与排序一起工作,实际上使模型更简单。制表符并不重要,但比较“A”和“B”就可以了。我想我是在试图解决“模型”中的“视图”问题。我做了一个单独的回答,因为我很感激任何批评意见


请看一下这个问题的答案,这里给出了一些很好的新建议:

+1谢谢你提醒我关于标签的事情。这并不重要,但这篇文章很好。我的空栏想法也使排序成为一个问题。哦,这就是它的意思!我在下面改了。谢谢。事实证明,这不是我想要的,但可能对在这里登陆的其他人有用+1.
jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
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());
}