1

Java GUI で jLayeredPane を使用しています。jLayeredPane の DEFAULT_LAYER にいくつかのパネル (jPanelsLayer1) を追加しました。また、各 jPanel には、目的のために mouseEntered と mouseExited をオーバーライドする MouseAdapter があります。jPanelsLayer1 の上にある JlayerdePane の PALETTE_LAYER に別のコンポーネント (jPanelsLayer2) を追加し、それらに MouseAdapter を定義すると、問題が発生します。マウスが共通領域に入ると、異なるレイヤーの jPanel の mouseEntered と mouseExited が数回連続して実行されます。jpanelLayer1 の上に表示されている場合は、jPanelslayer2 の mouseAdapters のみをアクティブにします。おそらく解決策は、jPanelLayer1 mouseAdapter を削除することです。しかし、これは効果的ではありません。

私を案内してください.....サジャド

4

1 に答える 1

3

テストしたところ、パレットパネ​​ルがデフォルトパネルの上にある場合でも、マウスがパレットパネ​​ルの上にある場合にのみ、マウスがパレットパネ​​ルでアクティブになるため、問題がどこにあるのかわかりません。たとえば、ここにコンセプトをテストするための私の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();
         }
      });
   }
}
于 2011-06-23T13:56:02.253 に答える