Java: проблема jLayeredPane, определяющая mouseAdapter для различных компонентов слоя - PullRequest
1 голос
/ 23 июня 2011

Я использую jLayeredPane в моем Java GUI. Я добавил несколько панелей (jPanelsLayer1) в DEFAULT_LAYER моего jLayeredPane, а также у каждого jPanel есть MouseAdapter, который переопределяет mouseEntered и mouseExited для моих целей. Когда я добавляю другие компоненты (jPanelsLayer2) в PALETTE_LAYER JlayerdePane, в верхней части jPanelsLayer1 и определяю MouseAdapter для них, у меня возникает проблема. Когда мышь вошла в общую область mouseEntered и mouseExited из jPanels разных слоев запускаются несколько раз подряд. Я хочу, чтобы активными были только мышиные адаптеры jPanelslayer2, когда они видны сверху jpanelLayer1. Может быть, решение будет удалить jPanelLayer1 mouseAdapter. Но это не эффективно.

Пожалуйста, ведите меня ..... Саджад

1 Ответ

3 голосов
/ 23 июня 2011

Я не уверен, в чем ваша проблема, потому что при тестировании мышь активна на панели «Палитра», только когда она находится над панелью «Палитра», даже если панель «Палитра» находится над панелью «По умолчанию».Например, вот мой SSCCE для проверки концепции.Не стесняйтесь изменить это, чтобы показать нам вашу проблему:

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();
         }
      });
   }
}
...