私はたくさん検索し、このQについていくつかの回答を得ましたが、それらの多くは404エラーを与えるリンクを参照していました。私はこのようなテーブルを作りたいです:
Javaこのためのメソッドはありますか?
MultiSpanCellTableExample は、カスタムTableUI
を作成してセルをマージする方法を示しています。この例では、少なくともJava 6)でStackOverflowError
を引き起こす問題があるようです。これを修正するには、AttributiveCellTableModel.setDataVector()
内で次を置き換えます。
setColumnIdentifiers(columnNames);
と:
this.columnIdentifiers = columnNames;
IE:
public void setDataVector(Vector newData, Vector columnNames) {
if (newData == null)
throw new IllegalArgumentException(
"setDataVector() - Null parameter");
dataVector = new Vector(0);
// setColumnIdentifiers(columnNames);
this.columnIdentifiers = columnNames;
dataVector = newData;
cellAtt = new DefaultCellAttribute(dataVector.size(),
columnIdentifiers.size());
newRowsAdded(new TableModelEvent(this, 0, getRowCount() - 1,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}
問題は、setColumnIdentifiers
がsetDataVector
を呼び出し、それによってStackOverflowError
がトリガーされることです。修正すると、例は次のようになります。
[〜#〜] jide [〜#〜] からの解決策もありますが、残念ながら無料ではありません。たとえば、CellSpanTable
は次のとおりです。
MultiCellSpanTableExample は問題ありませんが、テーブルに列が多すぎると大きな問題になる可能性のある小さな問題があります。テナーサックスによって与えられた 例 でわかるように、明らかに各テーブル列の幅には余分なピクセルがあります。これらの追加のピクセルが合計され、各列が最後の列よりも変位します。
次の行を置き換えることで、簡単に修正できます。
cellFrame.width = aColumn.getWidth() + columnMargin;
と:
cellFrame.width = aColumn.getWidth() + columnMargin - 1;
誰も尋ねなかったことは知っていますが、これが誰かに役立つことを願っています。 :)
カスタム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;
}
}
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();
}
});
}
}