JTableのCellEditorにJPanelを使用して複数コンポーネントを配置
Total: 6954
, Today: 2
, Yesterday: 5
Posted by aterai at
Last-modified:
概要
JTable
のCellEditor
、CellRenderer
にJPanel
を使用することで、内部に複数コンポーネントを配置したり、セル内の余白を追加します。
Screenshot
Advertisement
サンプルコード
class ButtonsPanel extends JPanel {
public final List<JButton> buttons = Arrays.asList(
new JButton("+"), new JButton("-"));
public final JLabel label = new JLabel() {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 50;
return d;
}
};
public int i = -1;
public ButtonsPanel() {
super();
label.setHorizontalAlignment(SwingConstants.RIGHT);
setOpaque(true);
add(label);
for (JButton b : buttons) {
b.setFocusable(false);
b.setRolloverEnabled(false);
add(b);
}
}
}
class ButtonsRenderer extends ButtonsPanel implements TableCellRenderer {
public ButtonsRenderer() {
super();
setName("Table.cellRenderer");
}
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
this.setBackground(isSelected ? table.getSelectionBackground()
: table.getBackground());
label.setForeground(isSelected ? table.getSelectionForeground()
: table.getForeground());
label.setText(Objects.toString(value, ""));
return this;
}
}
class ButtonsEditor extends ButtonsPanel implements TableCellEditor {
public ButtonsEditor() {
super();
buttons.get(0).addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
i++;
label.setText("" + i);
fireEditingStopped();
}
});
buttons.get(1).addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
i--;
label.setText("" + i);
fireEditingStopped();
}
});
addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e) {
fireEditingStopped();
}
});
}
@Override public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
this.setBackground(table.getSelectionBackground());
label.setForeground(table.getSelectionForeground());
i = (Integer) value;
label.setText("" + i);
return this;
}
@Override public Object getCellEditorValue() {
return i;
}
// Copied from AbstractCellEditor
// ...
View in GitHub: Java, Kotlin解説
0
列目:JPanel
+JSpinner
TableCellEditor
とTableCellRenderer
にJSpinner
を配置したJPanel
を使用JPanel
にGridBagLayout
を指定してinsets = new Insets(0, 10, 0, 10)
、fill = GridBagConstraints.HORIZONTAL
で余白を設定- JTableのCellEditorに設定したJComboBoxに余白を追加する
1
列目:JPanel
+JLabel
+JButton
TableCellEditor
とTableCellRenderer
にJLabel
と2
つのJButton
を配置したJPanel
を使用JPanel
にはFlowLayout
を指定- カラム幅が狭くなって折り返しが発生してもセルの高さは変化しないのでコンポーネントが見切れてしまう
- JTableのセルに複数のJButtonを配置する
参考リンク
- TableCellEditorのレイアウトを変更
- JTableのCellEditorに設定したJComboBoxに余白を追加する
- JTableのセルに複数のJButtonを配置する
- CellEditorをJSpinnerにして日付を変更