Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-从鼠标侦听器更改JComponent不透明度_Java_Swing_Opacity_Jcomponent_Mouselistener - Fatal编程技术网

Java Swing-从鼠标侦听器更改JComponent不透明度

Java Swing-从鼠标侦听器更改JComponent不透明度,java,swing,opacity,jcomponent,mouselistener,Java,Swing,Opacity,Jcomponent,Mouselistener,很像标题所说的——我有一个JPanel,如果不活动,我希望它的透明度为90%,如果鼠标移到上面,则完全不透明 我已经让单独的组件工作了-鼠标在上面和外面是可以的,我可以通过覆盖paintComponent方法来更改不透明度,但是我想我在MouseAdapter和paintComponent之间的连接上遇到了问题 似乎有一个非常简单的方法可以做到这一点-有什么建议吗 (顺便说一句,很抱歉把代码留在家里了,所以现在没有例子:(除非它不能很快解决,否则我明天会抛出一些代码。)如果您已经覆盖了paint

很像标题所说的——我有一个JPanel,如果不活动,我希望它的透明度为90%,如果鼠标移到上面,则完全不透明

我已经让单独的组件工作了-鼠标在上面和外面是可以的,我可以通过覆盖
paintComponent
方法来更改不透明度,但是我想我在
MouseAdapter
paintComponent
之间的连接上遇到了问题

似乎有一个非常简单的方法可以做到这一点-有什么建议吗


(顺便说一句,很抱歉把代码留在家里了,所以现在没有例子:(除非它不能很快解决,否则我明天会抛出一些代码。)

如果您已经覆盖了paintComponent方法,我建议您将MouseAdapter设置为面板的匿名内部类,并让它操作一个私有布尔标志

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
         }
    }
}

如果您已经重写了paintComponent方法,我建议您将MouseAdapter设置为面板的匿名内部类,并让它操作私有布尔标志

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
         }
    }
}

如果要覆盖
paintComponent
方法,则应该能够向
JPanel
扩展添加不透明度变量。在
MouseAdapter
中修改此变量(使用mutators)。然后在重写的
paintComponent
方法中引用此变量,以确定如何绘制。

如果要重写
paintComponent
方法,则应该能够将不透明度变量添加到
JPanel
扩展名中。在
MouseAdapter
中修改此变量(使用变体)。然后在重写的
paintComponent
方法中引用此变量,以确定如何绘制。

天哪,我没有Haase和Guy手册,我也不记得他们建议如何为半透明组件编写代码,但我想重写paint或paintComponent工作,除非重写paint将显示get go对子组件的影响。例如:

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本身,那会更好。

天哪,我没有Haase和Guy的书,我也不记得他们建议如何为半透明组件编写代码,但我想重写paint或paint component工作,除非重写paint会显示e从开始对子组件的影响。例如:

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本身,效果会更好。

+1这也是一个可行的解决方案,可能更有效,这取决于情况+1的答案,但这是少数几次可以优先使用覆盖涂料而不是涂料组件,尤其是当组件涉及子项和边界(例如JButton)@Hovercraft-事实上,它确实有几个孩子,其中一个确实是一个JButton。我不太清楚你的意思-你是说,如果孩子然后覆盖
paint
?相关的:
paint
也画孩子吗?真的,解决这个问题的最好办法是跑到你的在线商店,由Haase和Guy购买。是的这是解决类似问题的最佳资源。+1这也是一个可行的解决方案,可能更有效,具体取决于答案的情况+1,但这是少数几个优先使用覆盖绘制而不是绘制组件的情况之一,尤其是当组件涉及子项和边框(如JButton)时@Hovercraft-事实上,它确实有几个孩子,其中一个确实是一个JButton。我不太清楚你的意思-你是说,如果孩子然后覆盖
paint
?相关的:
paint
也画孩子吗?真的,解决这个问题的最好办法是跑到你的在线商店,由Haase和Guy购买。是的这是解决类似问题的最佳资源。+1在这种情况下,我更希望panel类是自包含的,而不是公开不必要的公共接口,因为每个信息本质上都存在于类本身。但这可能是一个品味问题。同意。我不确定代码最初是如何构造的,所以我给出了一个更全面的定义l解释。你的例子是我通常会如何实现这样的东西(为了清楚起见,应该如何实现)。虽然这两个答案相似,但我还是用这个答案,因为我认为这个组件的子组件将需要访问相同的变量(稍后将测试).1在本例中,我希望panel类是自包含的,并且不公开不必要的公共接口,因为每个信息基本上都存在于类本身。但这可能是一个品味问题。同意。我不确定代码最初是如何构造的,所以我给出了更一般的解释。您的示例就是我通常使用的uld实现类似的东西(为了清楚起见,它应该是怎样的)。虽然这两个答案是相似的,但我还是用这个答案,因为我认为这个组件的子组件将需要访问相同的变量(稍后将进行测试)。