【问题标题】:Creating a mouselistener over a single Jpane在单个 Jpane 上创建鼠标侦听器
【发布时间】:2013-08-13 23:59:40
【问题描述】:

这是我的第一篇文章,所以我希望它不会太令人畏惧。所以我正在尝试创建一个基于十六进制的策略游戏,但还没有完全实现。

为了实现基于十六进制的游戏,我想创建一个由十六进制组成的字段,用户应该能够单击该字段,并接收该像素的坐标。目前,我可以生成一个十六进制字段或一个鼠标侦听器/鼠标适配器,但不能同时生成两者。最后执行的替换屏幕上的另一个。

如果pane.add(New HexMap());用pane.add(new MouseListener())切换;侦听器工作但未打印该行

我已经环顾了很长时间,但我遇到的帖子要么涉及更改鼠标侦听器可以做的背景颜色,因为背景独立于鼠标传感器http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html?我得到的其他示例对我来说太高级了,因为它们使用了多个窗格,而我无法理解它们http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html。

所以我正在寻找一种在单个窗格上添加鼠标侦听器的方法,显示十六进制。这可能吗? 例如,在 mouselistener 之后添加 hexMap 不会覆盖 mouselistener 而是充当添加

已创建单行作为十六进制的占位符。

代码:

    import java.awt.*;                      
    import java.awt.event.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;

    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;



    public class GraphicsSetup extends JPanel{      

    public static final int FRAME_WIDTH = 600;
    public static final int FRAME_HEIGHT= 400;      

    private static JFrame frame;


    public static void main(String[] args){
        GraphicsSetup draw = new GraphicsSetup();           
    }

    public GraphicsSetup(){     

        HexMap hexMap = new HexMap();       
        JPanel panel = new JPanel();            
        frame = new JFrame("HexExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);            
        Container pane = frame.getContentPane();            
        pane.setBackground(new Color(20, 100, 30));
        pane.add(new MouseListener());
        pane.add(new HexMap()); 
        frame.setVisible(true);         
    }    

    public class HexMap extends JComponent{

        public void paint(Graphics g){          
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.blue);           
            g2d.drawLine(0,0, FRAME_WIDTH, FRAME_HEIGHT);                   
        }       
    }
    class MouseListener extends JComponent{

        public MouseListener(){

            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent me) {
                    System.out.println("Mouse Event" + me);                     
                }
            });             
        }           
    }       
}   

此致

【问题讨论】:

  • 这篇关于Playing with Shapes 的帖子可能对您有所帮助,我希望 :-) 请记住,paint() 不用于自定义绘图,而paintComponent() 用于手头的任务。请查看Solving common painting problems,查看第一个问题和相同的解决方案:-) +1 真诚的 :-)
  • pane.add(new MouseListener()); 的顺序和 pane.add(new HexMap());很抱歉没有添加它,如果 mouselistener 是第一个,则不打印该行,反之亦然
  • 请解释一下,就像你在向一个孩子解释一样,一开始窗口是什么样的,现在究竟会发生什么。什么是十六进制,用鼠标单击会在哪里,单击后会发生什么?我猜这个问题还不清楚。
  • 执行后,您会看到一个带有蓝线的绿色字段。线是六边形的简化模型,真正的六边形稍后将取代线。该程序还旨在显示您用鼠标单击的点的特定坐标,但这部分不起作用。如果切换 pane.add() 之间的顺序,您将看不到蓝线,但鼠标侦听器开始工作。只有最后一次激活是可见的
  • 我仍然怀疑,我完全理解 :( 不过,如果你想做这样的事情,请看看这个 example !!!

标签: java swing awt mouselistener


【解决方案1】:

我不完全确定您的目标是什么,但请尝试将您的组件添加到您的 panel 对象中。如:

panel.add(new MouseListener());
panel.add(new HexMap());

然后将其添加到框架的内容窗格中:

pane.add(panel);

如果您想知道如何以不同方式排列界面,请在此处阅读有关布局管理器的信息:

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

编辑

尝试以下方法:

设置布局管理器使用BorderLayout:

JPanel panel = new JPanel(new BorderLayout()); 

将您的组件添加到面板并设置它们的位置:

panel.add(new MouseListener(), BorderLayout.NORTH);
panel.add(new HexMap(), BorderLayout.CENTER);

将面板添加到框架内容窗格中:

pane.add(panel);

这可行,但MouseListener 面板的大小非常小...接下来您需要弄清楚...

【讨论】:

  • 我尝试将 HexMap 和 MouseListener 添加到面板,然后将面板添加到容器中。但是在执行框架后变成灰色,并且鼠标监听器不起作用。这些部分应该就在 frame.setVisible(true) 之前吧?
  • 正确,看看修改后的答案。谢谢。
  • 没错,它可以工作,但感觉 GUI 应该能够有一个工作鼠标监听器,并在同一个地方绘制东西?
  • 如果你想让你的 HexMap 实例监听鼠标事件,那么你需要添加鼠标监听器,而不是创建一个新的面板/组件。所以这意味着创建一个 HexMap 的实例,例如 HexMap hexMap = new HexMap();然后调用 hexMap.addMouseListener(...);
猜你喜欢
  • 2013-06-14
  • 2012-03-17
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2011-12-18
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多