web-dev-qa-db-ja.com

DefaultTableModel / JTableのセルをマージする方法は?

私はたくさん検索し、このQについていくつかの回答を得ましたが、それらの多くは404エラーを与えるリンクを参照していました。私はこのようなテーブルを作りたいです:

No. of cells to be merged is not fixed

Javaこのためのメソッドはありますか?

13
Nikhil Chilwant

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

問題は、setColumnIdentifierssetDataVectorを呼び出し、それによってStackOverflowErrorがトリガーされることです。修正すると、例は次のようになります。

enter image description here

[〜#〜] jide [〜#〜] からの解決策もありますが、残念ながら無料ではありません。たとえば、CellSpanTableは次のとおりです。

enter image description here

17
tenorsax

MultiCellSpanTableExample は問題ありませんが、テーブルに列が多すぎると大きな問題になる可能性のある小さな問題があります。テナーサックスによって与えられた でわかるように、明らかに各テーブル列の幅には余分なピクセルがあります。これらの追加のピクセルが合計され、各列が最後の列よりも変位します。

次の行を置き換えることで、簡単に修正できます。

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

と:

cellFrame.width = aColumn.getWidth() + columnMargin - 1;

誰も尋ねなかったことは知っていますが、これが誰かに役立つことを願っています。 :)

8
Pedro Lima

カスタム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;
}
}

Oracleドキュメントから

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