📄 glasspanedemo.java
字号:
import javax.swing.*;import javax.swing.event.MouseInputAdapter;import java.awt.*;import java.awt.event.*;public class GlassPaneDemo { //声明一个自定义的glass pane类 static private MyGlassPane myGlassPane; public static void main(String[] args) { //声明一个JFrame顶级容器,并添加关闭窗口方法 JFrame frame = new JFrame("GlassPaneDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //添加一个选择框 JCheckBox changeButton = new JCheckBox("Glass pane \"visible\""); //默认为未选状态 changeButton.setSelected(false); //规定其选取触发事件 changeButton.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { //使glass Pane显示 myGlassPane.setVisible(e.getStateChange() == ItemEvent.SELECTED); } }); //得到content pane并布局可视化组件 Container contentPane = frame.getContentPane(); //设置布局管理器,添加按钮 contentPane.setLayout(new FlowLayout()); contentPane.add(changeButton); contentPane.add(new JButton("Button 1")); contentPane.add(new JButton("Button 2")); //示例化一个菜单栏 JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Menu"); menu.add(new JMenuItem("Do nothing")); menuBar.add(menu); //添加菜单栏到frame frame.setJMenuBar(menuBar); //构造自己的glass pane, myGlassPane = new MyGlassPane(changeButton, menuBar, frame.getContentPane()); //设置glass pane frame.setGlassPane(myGlassPane); frame.pack(); frame.setVisible(true); }}//自己的glass pane类class MyGlassPane extends JComponent { //声明一个点类 Point point; //组件的paint方法 public void paint(Graphics g) { if (point != null) { g.setColor(Color.red); g.fillOval(point.x - 10, point.y - 10, 20, 20); } } public void setPoint(Point p) { point = p; } //构造方法 public MyGlassPane(AbstractButton aButton, JMenuBar menuBar, Container contentPane) { //实例化一个自己定义的监听器 CBListener listener = new CBListener(aButton, menuBar, this, contentPane); //添加鼠标监听 addMouseListener(listener); //添加鼠标移动监听 addMouseMotionListener(listener); }}//生成自己的适配器类,处理鼠标事件class CBListener extends MouseInputAdapter { Toolkit toolkit; Component liveButton; JMenuBar menuBar; MyGlassPane glassPane; Container contentPane; boolean inDrag = false; //构造方法,实例化适配器 public CBListener(Component liveButton, JMenuBar menuBar, MyGlassPane glassPane, Container contentPane) { toolkit = Toolkit.getDefaultToolkit(); this.liveButton = liveButton; this.menuBar = menuBar; this.glassPane = glassPane; this.contentPane = contentPane; } //鼠标移动事件 public void mouseMoved(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标拖动事件 public void mouseDragged(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标点击事件 public void mouseClicked(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标进入事件 public void mouseEntered(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标移出事件 public void mouseExited(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标按下事件 public void mousePressed(MouseEvent e) { redispatchMouseEvent(e, false); } //鼠标释放事件 public void mouseReleased(MouseEvent e) { redispatchMouseEvent(e, true); inDrag = false; } private void redispatchMouseEvent(MouseEvent e,boolean repaint) { boolean inButton = false; boolean inMenuBar = false; Point glassPanePoint = e.getPoint(); Component component = null; Container container = contentPane; Point containerPoint = SwingUtilities.convertPoint( glassPane, glassPanePoint, contentPane); int eventID = e.getID(); if (containerPoint.y < 0) { inMenuBar = true; container = menuBar; containerPoint = SwingUtilities.convertPoint( glassPane, glassPanePoint, menuBar); testForDrag(eventID); } component = SwingUtilities.getDeepestComponentAt( container, containerPoint.x, containerPoint.y); if (component == null) { return; } if (component.equals(liveButton)) { inButton = true; testForDrag(eventID); } if (inMenuBar || inButton || inDrag) { Point componentPoint = SwingUtilities.convertPoint( glassPane, glassPanePoint, component); component.dispatchEvent(new MouseEvent(component, eventID, e.getWhen(), e.getModifiers(), componentPoint.x, componentPoint.y, e.getClickCount(), e.isPopupTrigger())); } if (repaint) { toolkit.beep(); glassPane.setPoint(glassPanePoint); glassPane.repaint(); } } private void testForDrag(int eventID) { if (eventID == MouseEvent.MOUSE_PRESSED) { inDrag = true; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -