1

タイトルが言うように - 私は JPanel を持っています。非アクティブの場合は不透明度を 90% にし、マウスオーバーした場合は完全に不透明にしたいと考えています。

paintComponent別々のコンポーネントが動作しています。マウス オーバーとマウス アウトは問題なく、メソッドをオーバーライドして不透明度を変更できますが、MouseAdapter と の間の接続に問題があると思いますpaintComponent

おそらくこれを行うには本当に簡単な方法があるようです-何かヒントはありますか?

(コードを家に置いてきて申し訳ありませんが、今のところ例はありません:(すぐに解決できない場合を除き、明日いくつかのコードをスローします。)

4

3 に答える 3

4

メソッドをオーバーライドしている場合は、不透明度変数を拡張機能paintComponentに追加できるはずです。JPanelこれを で変更しますMouseAdapter(ミューテーターを使用)。次に、オーバーライドされたメソッドでこの変数を参照して、paintComponentペイント方法を決定します。

于 2011-07-29T00:20:21.447 に答える
3

シュート、Haase と Guy の本を持っていないので、彼らが半透明コンポーネントのコーディングに推奨する方法を覚えていませんが、ペイントまたは paintComponent のいずれかをオーバーライドすると、ペイントをオーバーライドすると子への影響が表示されることを除いて、うまくいくと思います。最初からコンポーネント。例えば:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OpaqueJPanels {

   private static void createAndShowUI() {
      JPanel mainPanel = new JPanel(new GridLayout(1, 0));
      mainPanel.add(new OpaqueJPanel(false, "Override paintComponent"));
      mainPanel.add(new OpaqueJPanel(true, "Override paint"));

      JFrame frame = new JFrame("Opaque JPanels");
      frame.getContentPane().add(mainPanel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class OpaqueJPanel extends JPanel {
   private static final int OJP_WIDTH = 250;
   private static final int OJP_HEIGHT = OJP_WIDTH;
   private static final Composite TRANSLUSCENT_COMPOSITE = AlphaComposite
            .getInstance(AlphaComposite.SRC_OVER, 0.4f);
   private static final Composite NON_TRANSLUSCENT_COMPOSITE = AlphaComposite
            .getInstance(AlphaComposite.SRC_OVER, 1.0f);
   private boolean overridePaint;
   private boolean transluscent = true;

   public OpaqueJPanel(boolean overridePaint, String title) {
      add(new JButton("Button"));
      setBorder(BorderFactory.createTitledBorder(title));
      addMouseListener(new MouseAdapter() {
         @Override
         public void mouseEntered(MouseEvent e) {
            transluscent = false;
            getParent().repaint();
         }

         @Override
         public void mouseExited(MouseEvent e) {
            if (!OpaqueJPanel.this.contains(e.getPoint())) {
               transluscent = true;
               getParent().repaint();
            }
         }
      });
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(OJP_WIDTH, OJP_HEIGHT);
   }

   @Override
   public void paint(Graphics g) {
      if (!overridePaint) {
         super.paint(g);
         return;
      }
      Graphics2D g2 = (Graphics2D) g;
      Composite composite = transluscent ? TRANSLUSCENT_COMPOSITE
               : NON_TRANSLUSCENT_COMPOSITE;
      g2.setComposite(composite);
      super.paint(g);
   }

   @Override
   protected void paintComponent(Graphics g) {
      if (overridePaint) {
         super.paintComponent(g);
         return;
      }
      Graphics2D g2 = (Graphics2D) g;
      Composite composite = transluscent ? TRANSLUSCENT_COMPOSITE
               : NON_TRANSLUSCENT_COMPOSITE;
      g2.setComposite(composite);
      super.paintComponent(g);
   }
}

また、JPanel 自体ではなく、JPanel の親コンポーネントを再描画した方がよいこともわかりました。

于 2011-07-29T02:00:47.877 に答える
3

既に paintComponent メソッドをオーバーライドしている場合は、MouseAdapter を Panel の匿名内部クラスにして、プライベート ブール値フラグを操作できるようにすることをお勧めします。

public class FadingPanel extends JPanel
{
    private boolean active;

    public FadingPanel()
    {
        createMouseAdapter();
    }

    private void createMouseAdapter()
    {
        this.addMouseListener(new MouseAdapter()
        {
            // your mouseadapter code here toggling the active flag
        } 
    }

    @Override
    public boolean paintComponent(Graphics g)
    {
         if(active)
         {
              super.paintComponent(g);
         }
         else
         {
              // your semitransparent painting code here
         }
    }
}
于 2011-07-29T00:19:58.640 に答える