Java 如何合并DefaultTableModel/JTable中的单元格?

Java 如何合并DefaultTableModel/JTable中的单元格?,java,swing,jtable,tablecellrenderer,jtableheader,Java,Swing,Jtable,Tablecellrenderer,Jtableheader,我搜索了很多,得到了一些关于这个问题的答案。但是他们中的许多人提到了给出404错误的链接。 我想把桌子做成这样: java中是否有此方法?演示如何通过创建自定义的表格UI来合并单元格。本例中似乎有一个问题导致了stackoverflowerrror,至少在Java6中是这样。要解决此问题,请在attributeCellTableModel.setDataVector()中替换: setColumnIdentifiers(columnNames); 与: this.columnIdentifi

我搜索了很多,得到了一些关于这个问题的答案。但是他们中的许多人提到了给出404错误的链接。 我想把桌子做成这样:

java中是否有此方法?

演示如何通过创建自定义的
表格UI来合并单元格。本例中似乎有一个问题导致了
stackoverflowerrror
,至少在Java6中是这样。要解决此问题,请在
attributeCellTableModel.setDataVector()中替换:

setColumnIdentifiers(columnNames);
与:

this.columnIdentifiers = columnNames;
即:

问题是
setColumnIdentifiers
调用
setDataVector
,从而触发
StackOverflowerError
。一旦修复,该示例就是这样的:

还有一个现成的解决方案,不幸的是,它不是免费的。例如
CellSpanTable

很好,但如果表中的列太多,它会有一个小问题,这可能会成为一个大问题。正如您在tenorsax给出的示例中所看到的,显然每个表列的宽度都有一个额外的像素。这些额外的像素加起来,使得每一列的位移都比最后一列大

我可以简单地通过更换线路来解决这一问题:

cellFrame.width = aColumn.getWidth() + columnMargin;
与:


我知道没有人问,但我希望这能帮助别人

使用自定义TableCellRenderer

import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class HeaderRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
TableCellRenderer renderer;

public HeaderRenderer(JTable table) {
  renderer = table.getTableHeader().getDefaultRenderer();
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {

super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
switch (col) {
case 0:
  setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.LIGHT_GRAY));
break;
case 1:
  setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.LIGHT_GRAY));
break;
default:
  setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.LIGHT_GRAY));
break;
}
  return this;
}
}


在我的一个项目中,我使用。在另一个示例中,我使用来自的组头。试试看。你应该检查和/或。@Qui线程“main”java.lang中的异常。StackOverflowError@Qui
setColumnIdentifiers(列名称)导致了问题我已经使用JIDE很多年了。如果你负担得起的话,这个API非常丰富。我相信他们可能有一个学生版本。不确定。为jidesoft做一个谷歌。谢谢!在发现问题之前找到解决方案是最好的!
cellFrame.width = aColumn.getWidth() + columnMargin - 1;
import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class HeaderRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
TableCellRenderer renderer;

public HeaderRenderer(JTable table) {
  renderer = table.getTableHeader().getDefaultRenderer();
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {

super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
switch (col) {
case 0:
  setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.LIGHT_GRAY));
break;
case 1:
  setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.LIGHT_GRAY));
break;
default:
  setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.LIGHT_GRAY));
break;
}
  return this;
}
}
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class SimpleTableDemo extends JPanel {
private static final long serialVersionUID = 1L;
public SimpleTableDemo() {
super(new GridLayout(1, 0));

String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };

    Object[][] data = { { "Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false) },{ "John", "Doe", "Rowing", new Integer(3), new Boolean(true) },{ "Sue", "Black", "Knitting", new Integer(2), new Boolean(false) },{ "Jane", "White", "Speed reading", new Integer(20), new Boolean(true) },    { "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };

JTable table = new JTable(data, columnNames);
TableCellRenderer myRenderer = new HeaderRenderer(table);
table.getTableHeader().setDefaultRenderer(myRenderer);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);

JScrollPane scrollPane = new JScrollPane(table);

add(scrollPane);
}

private static void createAndShowGUI() {
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

SimpleTableDemo newContentPane = new SimpleTableDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);

frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}