JTableのヘッダーのチェックボックスがNimbus L&Fで異なるレンダリングをする

rcnpl:

JTableヘッダーにチェックボックスがあり、Nimbus L&Fを使用してヘッダーの背景をカスタマイズしていますが、チェックボックスの背景は、他の列のようにカスタマイズされたものではなく、デフォルトの灰色の背景になります。

以下はCheckboxRendererクラスです

public class CheckBoxHeader extends JCheckBox implements TableCellRenderer{

public CheckBoxHeader(ItemListener itemListener) {      
    addItemListener(itemListener);
    setHorizontalAlignment(SwingConstants.CENTER);
    setOpaque(true);        
}

public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {                    
        JTableHeader header = table.getTableHeader();           
        Color bg = header.getBackground();
        setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue()));     
    return this;
}

そしてテーブルで

TableColumn tc = getColumnModel().getColumn(0);  
tc.setCellEditor(getDefaultEditor(Boolean.class));  
tc.setCellRenderer(getDefaultRenderer(Boolean.class));      
((JComponent)getDefaultRenderer(Boolean.class)).setOpaque(true);        
tc.setHeaderRenderer(new CheckBoxHeader());

AFAIKは、DefaultTableCellRendererでレンダリングする必要があるヘッダーの適切なレンダリングを取得しますが、その方法を取得していません。助言がありますか?

食事:

すべてのLnFで動作するかどうかはよくわかりません(Windows 7、Java 1.7.0_03のみをテスト):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class NimbusHeaderCheckBox {
  public JComponent makeUI() {
    Object[] columnNames = {Status.INDETERMINATE, "Integer", "String"};
    Object[][] data = {{true, 1, "b"}, {false, 9, "a"}, {true, 5, "c"}};
    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
      }
    };
    JTable table = new JTable(model);
    model.addTableModelListener(new HeaderCheckBoxHandler(table));

    TableCellRenderer r = new HeaderRenderer(table.getTableHeader(), 0);
    table.getColumnModel().getColumn(0).setHeaderRenderer(r);
    //<ins>
    TableCellRenderer leftAlign = new LeftAlignHeaderRenderer();
    table.getColumnModel().getColumn(1).setHeaderRenderer(leftAlign);
    table.getColumnModel().getColumn(2).setHeaderRenderer(leftAlign);
    //</ins>
    table.getTableHeader().setReorderingAllowed(false);
    return new JScrollPane(table);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    try {
      //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels())
        if ("Nimbus".equals(laf.getName())) UIManager.setLookAndFeel(laf.getClassName());
    } catch(Exception e) {
      e.printStackTrace();
    }
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new NimbusHeaderCheckBox().makeUI());
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
class HeaderRenderer extends JCheckBox implements TableCellRenderer {
  public HeaderRenderer(JTableHeader header, final int targetColumnIndex) {
    super((String)null);
    setOpaque(false);
    setFont(header.getFont());
    header.addMouseListener(new MouseAdapter() {
      @Override public void mouseClicked(MouseEvent e) {
        JTableHeader header = (JTableHeader)e.getSource();
        JTable table = header.getTable();
        TableColumnModel columnModel = table.getColumnModel();
        int vci = columnModel.getColumnIndexAtX(e.getX());
        int mci = table.convertColumnIndexToModel(vci);
        if(mci == targetColumnIndex) {
          TableColumn column = columnModel.getColumn(vci);
          Object v = column.getHeaderValue();
          boolean b = Status.DESELECTED.equals(v)?true:false;
          TableModel m = table.getModel();
          for(int i=0; i<m.getRowCount(); i++) m.setValueAt(b, i, mci);
          column.setHeaderValue(b?Status.SELECTED:Status.DESELECTED);
        }
      }
    });
  }
  @Override public Component getTableCellRendererComponent(
      JTable tbl, Object val, boolean isS, boolean hasF, int row, int col) {
    if(val instanceof Status) {
      switch((Status)val) {
      case SELECTED:
        setSelected(true); setEnabled(true); break;
      case DESELECTED:
        setSelected(false); setEnabled(true); break;
      case INDETERMINATE:
        setSelected(true); setEnabled(false); break;
      }
    } else {
      setSelected(true); setEnabled(false);
    }
    TableCellRenderer r = tbl.getTableHeader().getDefaultRenderer();
    JLabel l=(JLabel)r.getTableCellRendererComponent(tbl, null, isS, hasF, row, col);

    l.setIcon(new CheckBoxIcon(this));
    l.setText(null); //XXX Nimbus LnF ???
    ////This block has no effect at all as all the columns are center aligned
    ////(pointed out by rcnpl)
    //if(tbl.convertColumnIndexToModel(col)==0) {
    //  l.setHorizontalAlignment(SwingConstants.CENTER);
    //} else {
    //  l.setHorizontalAlignment(SwingConstants.LEFT);
    //}
    //<ins>
    l.setHorizontalAlignment(SwingConstants.CENTER);
    //</ins>
    return l;
  }
}
//<ins>
class LeftAlignHeaderRenderer implements TableCellRenderer {
  @Override public Component getTableCellRendererComponent(
    JTable t, Object v, boolean isS, boolean hasF, int row, int col) {
    TableCellRenderer r = t.getTableHeader().getDefaultRenderer();
    JLabel l=(JLabel)r.getTableCellRendererComponent(t, v, isS, hasF, row, col);
    l.setHorizontalAlignment(SwingConstants.LEFT);
    return l;
  }
}
//</ins>
enum Status { SELECTED, DESELECTED, INDETERMINATE }
class CheckBoxIcon implements Icon {
  private final JCheckBox check;
  public CheckBoxIcon(JCheckBox check) {
    this.check = check;
  }
  @Override public int getIconWidth() {
    return check.getPreferredSize().width;
  }
  @Override public int getIconHeight() {
    return check.getPreferredSize().height;
  }
  @Override public void paintIcon(Component c, Graphics g, int x, int y) {
    SwingUtilities.paintComponent(
        g, check, (Container)c, x, y, getIconWidth(), getIconHeight());
  }
}
class HeaderCheckBoxHandler implements TableModelListener {
  private final JTable table;
  public HeaderCheckBoxHandler(JTable table) {
    this.table = table;
  }
  @Override public void tableChanged(TableModelEvent e) {
    if(e.getType()==TableModelEvent.UPDATE && e.getColumn()==0) {
      int mci = 0;
      int vci = table.convertColumnIndexToView(mci);
      TableColumn column = table.getColumnModel().getColumn(vci);
      Object title = column.getHeaderValue();
      if(!Status.INDETERMINATE.equals(title)) {
        column.setHeaderValue(Status.INDETERMINATE);
      } else {
        int selected = 0, deselected = 0;
        TableModel m = table.getModel();
        for(int i=0; i<m.getRowCount(); i++) {
          if(Boolean.TRUE.equals(m.getValueAt(i, mci))) {
            selected++;
          } else {
            deselected++;
          }
        }
        if(selected==0) {
          column.setHeaderValue(Status.DESELECTED);
        } else if(deselected==0) {
          column.setHeaderValue(Status.SELECTED);
        } else {
          return;
        }
      }
      table.getTableHeader().repaint();
    }
  }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ヘッダーの中央のチェックボックス

分類Dev

WPF DataGridヘッダーのチェックボックスのみ?

分類Dev

テーブルヘッダーのTandelionDatatablesチェックボックス

分類Dev

StopPropagation()-uib-accordionヘッダーのチェックボックス-AngularJS

分類Dev

JTableでチェックボックスをレンダリングする方法は?

分類Dev

uib-accordionのヘッダーでチェックボックスが機能しない

分類Dev

WPFDataGridのDataGridヘッダーチェックボックスの列のすべてのチェックボックスを選択する方法

分類Dev

ng-grid列ヘッダーの複数選択チェックボックスが機能しない

分類Dev

実行時にヘッダー列のチェックボックスがオンになっているときに、データグリッドのすべてのチェックボックスをオンにするにはどうすればよいですか?

分類Dev

ヘッダーチェックボックスを選択すると、すべての行が選択されますが、いずれかの行がチェックされていない場合は、テーブルでヘッダーチェックボックスが選択解除されている必要があります

分類Dev

グリッドヘッダーのチェックボックスに値を割り当てます

分類Dev

wpflistviewヘッダーのチェックボックスがすべての項目をチェックしていない

分類Dev

JQueryグリッドは、ヘッダーチェックボックスをクリックすると最初の2行のみを選択します

分類Dev

剣道グリッド:グリッド全体のすべてのページのボックスをチェックする列ヘッダーチェックボックス「すべてチェック」

分類Dev

C#でWebDataGridのヘッダーチェックボックスをオフにする方法

分類Dev

Word VBA-特定のチェックボックスがオンになっている場合、ヘッダーを展開しますか?

分類Dev

XCodeカスタムテンプレート-チェックボックスのみのフォルダー構造(バリエーション「チェックボックスがチェックされていない」を配置する場所)?

分類Dev

jTableは、チェックボックスがチェックボックスであるデータのみを選択します

分類Dev

Datagridviewのヘッダーセルにチェックボックスを追加する

分類Dev

各CMFCTabCtrlのタブヘッダーにチェックボックスを配置する方法

分類Dev

InfragisticsXamDataGridのヘッダーチェックボックスを有効/無効にする方法

分類Dev

DataGridViewのヘッダーセルにチェックボックスを追加する方法

分類Dev

ヘッダーチェックボックスを選択したら、すべてのチェックボックスを選択します

分類Dev

JTableがセルのチェックボックスを無効にする

分類Dev

Java: 別のチェックボックスがクリックされたときに JTable 内のチェックボックスを自動的に更新する

分類Dev

アコーディオンヘッダーがBigCommerceオプションのチェックボックスをクリックしてバブリングするのを防ぎますか?

分類Dev

ヘッダーの有効なトークンをチェックするIstioEnvoyFilter

分類Dev

ヘッダーの選択チェックボックスのng-gridイベント

分類Dev

Djangoで選択する代わりにチェックボックスとしてテンプレートの外部キーをレンダリングする

Related 関連記事

  1. 1

    ヘッダーの中央のチェックボックス

  2. 2

    WPF DataGridヘッダーのチェックボックスのみ?

  3. 3

    テーブルヘッダーのTandelionDatatablesチェックボックス

  4. 4

    StopPropagation()-uib-accordionヘッダーのチェックボックス-AngularJS

  5. 5

    JTableでチェックボックスをレンダリングする方法は?

  6. 6

    uib-accordionのヘッダーでチェックボックスが機能しない

  7. 7

    WPFDataGridのDataGridヘッダーチェックボックスの列のすべてのチェックボックスを選択する方法

  8. 8

    ng-grid列ヘッダーの複数選択チェックボックスが機能しない

  9. 9

    実行時にヘッダー列のチェックボックスがオンになっているときに、データグリッドのすべてのチェックボックスをオンにするにはどうすればよいですか?

  10. 10

    ヘッダーチェックボックスを選択すると、すべての行が選択されますが、いずれかの行がチェックされていない場合は、テーブルでヘッダーチェックボックスが選択解除されている必要があります

  11. 11

    グリッドヘッダーのチェックボックスに値を割り当てます

  12. 12

    wpflistviewヘッダーのチェックボックスがすべての項目をチェックしていない

  13. 13

    JQueryグリッドは、ヘッダーチェックボックスをクリックすると最初の2行のみを選択します

  14. 14

    剣道グリッド:グリッド全体のすべてのページのボックスをチェックする列ヘッダーチェックボックス「すべてチェック」

  15. 15

    C#でWebDataGridのヘッダーチェックボックスをオフにする方法

  16. 16

    Word VBA-特定のチェックボックスがオンになっている場合、ヘッダーを展開しますか?

  17. 17

    XCodeカスタムテンプレート-チェックボックスのみのフォルダー構造(バリエーション「チェックボックスがチェックされていない」を配置する場所)?

  18. 18

    jTableは、チェックボックスがチェックボックスであるデータのみを選択します

  19. 19

    Datagridviewのヘッダーセルにチェックボックスを追加する

  20. 20

    各CMFCTabCtrlのタブヘッダーにチェックボックスを配置する方法

  21. 21

    InfragisticsXamDataGridのヘッダーチェックボックスを有効/無効にする方法

  22. 22

    DataGridViewのヘッダーセルにチェックボックスを追加する方法

  23. 23

    ヘッダーチェックボックスを選択したら、すべてのチェックボックスを選択します

  24. 24

    JTableがセルのチェックボックスを無効にする

  25. 25

    Java: 別のチェックボックスがクリックされたときに JTable 内のチェックボックスを自動的に更新する

  26. 26

    アコーディオンヘッダーがBigCommerceオプションのチェックボックスをクリックしてバブリングするのを防ぎますか?

  27. 27

    ヘッダーの有効なトークンをチェックするIstioEnvoyFilter

  28. 28

    ヘッダーの選択チェックボックスのng-gridイベント

  29. 29

    Djangoで選択する代わりにチェックボックスとしてテンプレートの外部キーをレンダリングする

ホットタグ

アーカイブ