概要

JTable自体をsetOpaque(false)で透明に、またセル描画に使用されるJTableの背景色を半透明にするなどの設定で、半透明のJTableを作成します。

サンプルコード

JScrollPane scroll = new JScrollPane(table) {
  private final TexturePaint texture = makeImageTexture();
  @Override protected JViewport createViewport() {
    return new JViewport() {
      @Override protected void paintComponent(Graphics g) {
        if (texture != null) {
          Graphics2D g2 = (Graphics2D) g;
          g2.setPaint(texture);
          g2.fillRect(0, 0, getWidth(), getHeight());
        }
        super.paintComponent(g);
      }
    };
  }
};
final Color alphaZero = new Color(0x0, true);
table.setOpaque(false);
table.setBackground(alphaZero);
scroll.getViewport().setOpaque(false);
scroll.getViewport().setBackground(alphaZero);
view all

解説

上記のサンプルでは、JViewportJTableのそれぞれにsetOpaque(false), setBackground(new Color(0x0, true));と設定することで、透明なJTableを作成しています。テクスチャ画像はJViewportpaintComponentメソッドをオーバーライドすることで表示しています。


JTableCellEditorは、JTable#prepareEditor(...)をオーバーライドして、以下のように設定しています。

  • JTextField: Object.classのデフォルト
    • 常にsetOpaque(false);
  • JCheckBox: Boolean.classのデフォルト
    • 常にsetBackground(JTable#getSelectionBackground());

JTableの背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRendererでは色が濃くなる(二重に描画される?)ので、paintComponentメソッドを以下のようにオーバーライドしています。

class TranslucentBooleanRenderer extends JCheckBox implements TableCellRenderer {
  private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
  public TranslucentBooleanRenderer() {
    super();
    setHorizontalAlignment(SwingConstants.CENTER);
    setBorderPainted(true);
  }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
      setOpaque(true);
      setForeground(table.getSelectionForeground());
      super.setBackground(table.getSelectionBackground());
    } else {
      setOpaque(false);
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    setSelected((value != null && ((Boolean) value).booleanValue()));
    if (hasFocus) {
      setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
    } else {
      setBorder(noFocusBorder);
    }
    return this;
  }
  @Override protected void paintComponent(Graphics g) {
    if (!isOpaque()) {
      g.setColor(getBackground());
      g.fillRect(0, 0, getWidth(), getHeight());
    }
    super.paintComponent(g);
  }
}

参考リンク

コメント