Использование нескольких панелей, но можно увидеть только одну - PullRequest
0 голосов
/ 24 октября 2019

Я использовал этот пример для решения проблемы, связанной с мышью, но мне также очень интересно понять, как я испортил панели.

Следующий пример представляет собой два примера, соединенных вместе. Предполагается, что координаты XY будут отображаться при перемещении мыши, так что XY будет виден во всплывающем меню, но слои не являются сильной областью, и я могу только заставить XY мыши показывать ИЛИ всплывающее меню для работы, ноне оба.

Где я ошибся в реализации панелей, которая препятствует отображению как XY, так и всплывающего меню?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.border.BevelBorder;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class MousePopupExample extends JPanel {

  public JPopupMenu popup;

  public MousePopupExample()
  {
    popup = new JPopupMenu();
    ActionListener menuListener = new ActionListener() {
      public void actionPerformed(ActionEvent event) 
      {
        System.out.println("Popup menu item ["
            + event.getActionCommand() + "] was pressed.");
      }
    };
    JMenuItem item;
    popup.add(item = new JMenuItem("Left", new ImageIcon("1.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Center", new ImageIcon("2.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Right", new ImageIcon("3.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Full", new ImageIcon("4.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.addSeparator();
    popup.add(item = new JMenuItem("Settings . . ."));
    item.addActionListener(menuListener);

    popup.setLabel("Justification");
    popup.setBorder(new BevelBorder(BevelBorder.RAISED));
    popup.addPopupMenuListener(new PopupPrintListener());

    addMouseListener(new MousePopupListener());
  }


// An inner class to check whether mouse events are the popup trigger
  class MousePopupListener extends MouseAdapter 
  {
    public void mouseMoves(MouseEvent e) {
      checkPopup(e);
    }

    public void mousePressed(MouseEvent e) {
      checkPopup(e);
    }

    public void mouseClicked(MouseEvent e) {
      checkPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
      checkPopup(e);
    }

    private void checkPopup(MouseEvent e) {
      if (e.isPopupTrigger()) {
        popup.show(MousePopupExample.this, e.getX(), e.getY());
      }
    }
  }

  // An inner class to show when popup events occur
  class PopupPrintListener implements PopupMenuListener {
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
      System.out.println("Popup menu will be visible!");
    }

    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
      System.out.println("Popup menu will be invisible!");
    }

    public void popupMenuCanceled(PopupMenuEvent e) {
      System.out.println("Popup menu is hidden!");
    }
  }

  public static void main(String s[]) {
    JFrame frame = new JFrame("Popup Menu Example");
    XYMouseLabel xyMouseLabel = new XYMouseLabel();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MousePopupExample mpe = new MousePopupExample();

    xyMouseLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight());    
    mpe.add(xyMouseLabel);

    frame.setContentPane(mpe);
    frame.setPreferredSize(new Dimension(400, 300));
    frame.pack();

    frame.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent me)
        {
            System.out.println("Mouse Move");
          xyMouseLabel.x = me.getX();
          xyMouseLabel.y = me.getY();
          xyMouseLabel.repaint();
        }
      });

    frame.setVisible(true);
  }


}

Ниже приводится 2-й класс.

 import java.awt.Color;
 import java.awt.Graphics;
 import javax.swing.JComponent;

class XYMouseLabel extends JComponent
{
  public int x;
  public int y;

  public XYMouseLabel() {
    this.setBackground(Color.blue);
  }

  // use the xy coordinates to update the mouse cursor text/label
  protected void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    String s = x + ", " + y;
    g.setColor(Color.red);
    g.drawString(s, x, y);
  }
}  
...