概要

JInternalFrameのフレーム内を半透明にします。

サンプルコード

JPanel p1 = new JPanel();
p1.setOpaque(false);

JPanel p2 = new JPanel() {
  @Override protected void paintComponent(Graphics g) {
    //super.paintComponent(g);
    g.setColor(new Color(100, 50, 50, 100));
    g.fillRect(0, 0, getWidth(), getHeight());
  }
};

JPanel p3 = new JPanel() {
  @Override protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    //g2.setPaint(new Color(100, 120, 100, 100));
    g2.setPaint(texture);
    g2.fillRect(0, 0, getWidth(), getHeight());
  }
};

protected JInternalFrame createFrame(JPanel panel) {
  MyInternalFrame frame = new MyInternalFrame();
  if (panel != null) {
    frame.setContentPane(panel);
    //JButton button = new JButton("button");
    //button.setOpaque(false);
    panel.add(new JLabel("label"));
    panel.add(new JButton("button"));
  }
  desktop.add(frame);
  frame.setOpaque(false);
  frame.setVisible(true);
  //...
view all

解説

各フレームは、JInternalFrame#setContentPane(Container)メソッドを使用して、ContentPaneを以下のような半透明パネルに変更しています。

  • Frame#1 (Transparent)
    • ContentPanesetOpaque(false)して透過
  • Frame#2 (Translucent)
    • ContentPaneを半透明な色で塗りつぶし
  • Frame#3 (Translucent)
    • ContentPaneを半透明な色を使ってチェック柄で塗りつぶし

参考リンク

コメント

  • JRE6.0だと、半透明にならずチェック模様が描画されるだけですね。仕様変わったのかな… --
    • 御指摘ありがとうございます。Windows XPで、Java 1.6.0_011.5.0_11は、半透明になったのですが、Ubuntu 7.04で、Java 1.6.0では駄目みたいです。Macは環境がないので試せてません。 -- aterai
    • すこし調べてみたのですが、Ubuntu(GNOME) でも半透明にするにはJInternalFrame#setOpaque(false)も必要みたいです。修正しておきます。 -- aterai
    • 再度試してみたら、JInternalFrame#setOpaque(false)しても、Ubuntu(GNOME)+JDK 1.6.0+GTKLookAndFeelで半透明になってくれません。なにかUbuntuの設定を弄ったから? -- aterai
  • NimbusLookAndFeelでも透明にできないようです。どちらもSynthLookAndFeelがベースなので、それが原因? -- aterai