テーブルヘッダーの色と境界線を取得するだけでなく、さらに多くの問題が関係しています。各セル/列は、によってTableCellRenderer
返される値UIManager
が無視される可能性があるという意味でレンダリングされます...
たとえば、以下は をレンダリングし、ウィンドウのルック アンド フィールの下でによって返される値に基づいてJTableHeader
、境界線/背景を に適用します...JLabel
UIManager
ご覧のとおり、両者にはかなりの違いがあります
ただし、スクロール ペインの別のコンポーネントの上にある種の「グループ ヘッダー」を表示することだけに関心がある場合はJTableHeader
、スクロール ペインの列ビューに直接追加することができます...
public class TestHeader {
public static void main(String[] args) {
new TestHeader();
}
public TestHeader() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
TableColumnModel model = new DefaultTableColumnModel();
final TableColumn column = new TableColumn(0, 250);
column.setHeaderValue("Test");
model.addColumn(column);
JTableHeader header = new JTableHeader();
header.setColumnModel(model);
final JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setColumnHeaderView(header);
textArea.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
column.setWidth(textArea.getWidth());
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
更新しました
public class TestHeader {
public static void main(String[] args) {
new TestHeader();
}
public TestHeader() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
TableColumnModel model = new DefaultTableColumnModel();
final TableColumn column = new TableColumn(0, 250);
column.setHeaderValue("I don't see the problem");
model.addColumn(column);
final JTableHeader header = new JTableHeader();
header.setColumnModel(model);
DefaultTableModel tm = new DefaultTableModel(new Object[]{"A", "B", "C"}, 0);
tm.addRow(new Object[]{"1", "2", "3", "4"});
tm.addRow(new Object[]{"5", "6", "7", "8"});
tm.addRow(new Object[]{"9", "10", "11", "12"});
tm.addRow(new Object[]{"13", "14", "15", "16"});
final JTable table = new JTable(tm);
final JScrollPane scrollPane = new JScrollPane(table);
/**
* For some reason, the header isn't being applied as soon as the
* table is added to the scroll pane, so we need to jump our next
* request to the end of the of event queue so that it will
* occur some time in the future
*/
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.setColumnHeaderView(header);
}
});
table.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
column.setWidth(table.getWidth());
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}