TITLE:JTableのCellEditorに設定したJComboBoxに余白を追加する
Posted by aterai at 2012-05-07

JTableのCellEditorに設定したJComboBoxに余白を追加する

JTableのCellEditorに設定したJComboBoxに余白を追加します。
  • category: swing folder: ComboBoxCellEditorInsets title: JTableのCellEditorに設定したJComboBoxに余白を追加する tags: [JTable, TableCellEditor, TableCellRenderer, JComboBox, LayoutManager] author: aterai pubdate: 2012-05-07T12:28:04+09:00 description: JTableのCellEditorに設定したJComboBoxに余白を追加します。 image: https://lh4.googleusercontent.com/-dIea13PoJ70/T6c7YezP1BI/AAAAAAAABMQ/e0IqDjxhjpw/s800/ComboBoxCellEditorInsets.png

概要

JTableCellEditorに設定したJComboBoxに余白を追加します。
ComboBoxCellEditorInsets.png

サンプルコード

サンプルコード

class ComboBoxPanel extends JPanel {
  public final JComboBox comboBox = new JComboBox(new String[] {"aaaaaa", "bbb", "c"});
  public final JComboBox<String> comboBox = new JComboBox<>(
      new String[] {"aaaaaa", "bbb", "c"});
#spanadd

#spanend
  public ComboBoxPanel() {
    super(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
#spandel

#spanend
    c.weightx = 1.0;
    c.insets = new Insets(0, 10, 0, 10);
    c.fill = GridBagConstraints.HORIZONTAL;
    add(comboBox, c);

    comboBox.setEditable(true);
    comboBox.setSelectedIndex(0);
    setOpaque(true);
    add(comboBox, c);
    comboBox.setSelectedIndex(0);
  }
}
#spanadd

#spanend
#spanadd
class ComboBoxCellRenderer extends ComboBoxPanel implements TableCellRenderer {
#spanend
  public ComboBoxCellRenderer() {
    super();
    setName("Table.cellRenderer");
  }
#spanadd

#spanend
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    this.setBackground(isSelected ? table.getSelectionBackground()
                                  : table.getBackground());
    if (value != null) {
      comboBox.setSelectedItem(value);
    }
    return this;
  }
#spanadd
}
#spanend
View in GitHub: Java, Kotlin

解説

  • Border(左)
    • JComboBox自身に余白を設定し、これをCellRenderer, CellEditorに使用

解説

  • Border(左)
    • JComboBox自身に余白を設定し、これをCellRendererCellEditorに適用
    • ドロップダウンリストの位置、サイズが余白を含んだ幅になる
      #spanend
      #spanadd
      combo.setBorder(BorderFactory.createCompoundBorder(
      #spanend
                      BorderFactory.createEmptyBorder(8, 10, 8, 10), combo.getBorder()));
      #spanadd
      
  • JPanel + JComboBox(右)
    • GridBagLayoutを使用するJPanelJComboBoxを追加
    • fillフィールドをGridBagConstraints.HORIZONTALとして垂直方向にはJComboBoxのサイズを変更しない
    • insetsフィールドを設定してJComboBoxの外側に別途(ドロップダウンリストの位置、サイズに影響しないように)余白を追加
  • - セルの中にあるJComboBoxの幅を可変ではなく固定にする場合は、以下のようなFlowLayoutのパネルにgetPreferredSize()をオーバーライドして幅を固定したJComboBoxを使用する方法もあります。
#spandel
combo.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(8,10,8,10), combo.getBorder()));
#spanend
#spanadd
class ComboBoxPanel extends JPanel {
#spanend
  private String[] m = new String[] {"a", "b", "c"};
  protected JComboBox<String> comboBox = new JComboBox<String>(m) {
    @Override public Dimension getPreferredSize() {
      Dimension d = super.getPreferredSize();
      return new Dimension(40, d.height);
    }
  };
#spanadd

#spanend
  public ComboBoxPanel() {
    super();
    setOpaque(true);
    comboBox.setEditable(true);
    add(comboBox);
  }
#spanadd
}
#spanend
  • JPanel+JComboBox(右)
    • GridBagLayout を使用するJPanelにJComboBox を追加
    • fill フィールドを GridBagConstraints.HORIZONTAL として、垂直にはJComboBox のサイズを変更しない
    • insets フィールドを設定して、JComboBoxの外側に別途(ドロップダウンリストの位置、サイズに影響しないように)余白を追加

参考リンク

参考リンク

コメント

コメント