TITLE:JTableのCellRendererにJComboBoxを設定

JTableのCellRendererにJComboBoxを設定

編集者:Terai Atsuhiro~

作成日:2007-03-19
更新日:2024-03-14 (木) 12:16:03
  • category: swing folder: ComboCellRenderer title: JTableのCellRendererにJComboBoxを設定 tags: [JTable, JComboBox, TableCellRenderer, TableCellEditor] author: aterai pubdate: 2007-03-19T02:32:35+09:00 description: JTableのCellRendererとしてJComboBoxを使用します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTJ35Po_yI/AAAAAAAAAVE/z4Jn6Mv7-pc/s800/ComboCellRenderer.png

概要

JTableCellRendererとしてJComboBoxを使用します。

概要

JTableのCellRendererとしてJComboBoxを使用します。

サンプルコード

#spanend
#spanadd
class ComboCellRenderer extends JComboBox implements TableCellRenderer {
#spanend
  private static final Color ec = new Color(240, 240, 255);
  private final JTextField editor;
  public ComboCellRenderer() {
    super();
    setEditable(true);
    setBorder(BorderFactory.createEmptyBorder());

#spandel
#screenshot
#spanend
    editor = (JTextField) getEditor().getEditorComponent();
    editor.setBorder(BorderFactory.createEmptyBorder());
    editor.setOpaque(true);
  }

#spandel
**サンプルコード [#l43fa315]
#spanend
#spandel
#code{{
#spanend
 class ComboCellRenderer extends JComboBox implements TableCellRenderer {
   private static final Color ec = new Color(240, 240, 255);
   private final JTextField editor;
   public ComboCellRenderer() {
     super();
     setEditable(true);
     setBorder(BorderFactory.createEmptyBorder());
 
     editor = (JTextField) getEditor().getEditorComponent();
     editor.setBorder(BorderFactory.createEmptyBorder());
     editor.setOpaque(true);
   }
   public Component getTableCellRendererComponent(JTable table, Object value,
                            boolean isSelected, boolean hasFocus,
                            int row, int column) {
     removeAllItems();
     if(isSelected) {
       editor.setForeground(table.getSelectionForeground());
       editor.setBackground(table.getSelectionBackground());
     }else{
       editor.setForeground(table.getForeground());
       editor.setBackground((row%2==0)?ec:table.getBackground());
     }
     addItem((value==null)?"":value.toString());
     return this;
   }
 }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value,
      boolean isSelected, boolean hasFocus,
      int row, int column) {
    removeAllItems();
    if (isSelected) {
      editor.setForeground(table.getSelectionForeground());
      editor.setBackground(table.getSelectionBackground());
    } else {
      editor.setForeground(table.getForeground());
      editor.setBackground((row % 2 == 0) ? ec : table.getBackground());
    }
    addItem(Objects.toString(value, ""));
    return this;
  }
#spanadd
}
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、1列目のセルの表示をJComboBoxにするために、これを継承するセルレンダラーを設定しています。1列目はセルエディタもJComboBoxですが、これらは別々のインスタンスです。

解説

  • 1列目(中央)のセルの表示をJComboBoxにするために、これを継承するセルレンダラーを設定
    • この列のセルエディタもJComboBoxを使用するが、セルレンダラーとは別のJComboBoxのインスタンスを設定
  • セルレンダラーとして使用するJComboBoxはセルの表示のみに使用するため、以下のように設定
    • 表示用のアイテム(文字列)を一つだけ持つ
    • 編集可にしてEditorComponentの背景色などを他のセルと同様になるように変更
    • セル内にきれいに収まるように余白を0に設定
レンダラーで使用するJComboBoxは、セルの表示のみに使用するため、以下のように設定しています。
  • 表示用のアイテム(文字列)を一つだけ持つ
  • 編集可にしてEditorComponentの背景色などを他のセルと同様になるように変更
  • セル内にきれいに収まるように余白を0に設定

参考リンク

参考リンク

コメント