Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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:jLayeredPane为不同层组件定义mouseAdapter时出现问题_Java_Swing_User Interface_Jlayeredpane - Fatal编程技术网

Java:jLayeredPane为不同层组件定义mouseAdapter时出现问题

Java:jLayeredPane为不同层组件定义mouseAdapter时出现问题,java,swing,user-interface,jlayeredpane,Java,Swing,User Interface,Jlayeredpane,我正在Java GUI中使用jLayeredPane。我在jLayeredPane的默认_层上添加了一些面板(jPanelsLayer1),并且每个jPanel都有一个MouseAdapter,用于覆盖mouseenterned和mouseexitted,以供我使用。当我在jLayerPane的PALETTE_层上、在jpanelLayer1的顶部添加另一个组件(jpanelLayer2)并为它们定义MouseAdapter时,我遇到了问题。当鼠标进入公共区域时,不同层的JPanel会连续运行几

我正在Java GUI中使用jLayeredPane。我在jLayeredPane的默认_层上添加了一些面板(jPanelsLayer1),并且每个jPanel都有一个MouseAdapter,用于覆盖mouseenterned和mouseexitted,以供我使用。当我在jLayerPane的PALETTE_层上、在jpanelLayer1的顶部添加另一个组件(jpanelLayer2)并为它们定义MouseAdapter时,我遇到了问题。当鼠标进入公共区域时,不同层的JPanel会连续运行几次。我只希望当在jpanelLayer1的顶部看到JPanellayer2鼠标捕捉器时,它们才处于活动状态。也许一个解决方案是移除jPanelLayer1鼠标捕捉器。但这并不有效


请为我提供guid….sajad

我不确定您的问题出在哪里,因为当我测试鼠标时,鼠标仅在面板上方的面板中处于活动状态,即使面板位于默认面板上方。例如,这里是我的测试概念。请随意修改此选项,向我们展示您的问题:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class LayeredFun extends JLayeredPane {
   private static final int JLP_WIDTH = 400;
   private static final int JLP_HEIGHT = 400;
   private static final Dimension PANEL_SIZE = new Dimension(200, 200);

   public LayeredFun() {
      JPanel defaultPanel = createPanel("Default Panel", new Point(10, 10), Color.cyan);
      JPanel palettePanel = createPanel("Palette Panel", new Point(100, 100), Color.pink);

      add(defaultPanel, JLayeredPane.DEFAULT_LAYER);
      add(palettePanel, JLayeredPane.PALETTE_LAYER);
   }

   private JPanel createPanel(String name, Point location, Color color) {
      JPanel defaultPanel = new JPanel();
      defaultPanel.setSize(PANEL_SIZE);
      defaultPanel.setLocation(location);
      MyMouseAdapter defaultMouseAdapater = new MyMouseAdapter(name);
      defaultPanel.addMouseListener(defaultMouseAdapater);
      defaultPanel.addMouseMotionListener(defaultMouseAdapater);
      defaultPanel.setBackground(color);
      defaultPanel.setBorder(BorderFactory.createTitledBorder(name));
      return defaultPanel;
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(JLP_WIDTH, JLP_HEIGHT);
   }

   private class MyMouseAdapter extends MouseAdapter {
      private String name;

      public MyMouseAdapter(String name) {
         this.name = name;
      }

      @Override
      public void mouseEntered(MouseEvent e) {
         System.out.printf("%s: mouseEntered%n", name);
      }

      @Override
      public void mouseExited(MouseEvent e) {
         System.out.printf("%s: mouseExited%n", name);
      }

      @Override
      public void mouseMoved(MouseEvent e) {
         System.out.printf("%s: mouseMoved%n", name);
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("LayeredFun");
      frame.getContentPane().add(new LayeredFun());
      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();
         }
      });
   }
}

首先感谢你的帮助。我测试了你的代码。你说得对。我的问题是另一件事(在mouseEntered&mouseexitte中,我有一个bug)。谢谢你有价值的回答@萨贾德:很高兴它有帮助,但更重要的是,这是一种学习和使用的有用技巧:有时解决问题的最佳方法是首先将其隔离。