代码之家  ›  专栏  ›  技术社区  ›  Michael Parker

JFrame和GlassPane-重新绘制的问题()

  •  0
  • Michael Parker  · 技术社区  · 10 年前

    这个问题可能很简单,因为我对JavaSwing或Graphics缺乏基本了解,如果是这样,我很抱歉。

    我正在尝试使用Java Swing开发一个GUI应用程序,该应用程序可以由外部设备控制,该设备通过蓝牙向应用程序发送俯仰、偏航和侧倾值。我的想法是创建一个光标(可能是一个空圆圈),当外部设备四处移动时,光标会四处移动。我在从设备接收数据方面没有问题,只是需要在所有组件上实际绘制一些东西的部分。

    我认为GlassPane是在整个应用程序上显示光标并在外部设备移动时移动光标的最简单方法。我使用一个线程来捕获数据,然后我尝试调用重新绘制(),但它似乎没有触发。

    以下是相关代码:

    J框架:

    public class Frame extends JFrame {
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        //Thread myoHandlerThread = new Thread(myoHandler);
                        //myoHandlerThread.start();
    
                        Frame frame = new Frame();
                        GlassPane glassPane = new GlassPane();
                        glassPane.setVisible(true);
                        frame.setGlassPane(glassPane);
    
                        frame.setVisible(true);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
    
        public Frame() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(50, 50, 1000, 650);
    
            /* Code to add and place components */
        }
    }
    

    还有我的玻璃窗格:

    public class GlassPane extends JComponent {
    
        private static double pitch;
        private static double yaw;
        private static double roll;
    
        Point point;
    
        public void setPoint(Point p) {
            this.point = p;
        }
    
        public void paintComponent(Graphics g) {
            if (point != null) {
                System.out.println("Test print statement");
                g.setColor(Color.red);
                g.fillOval(point.x - 10, point.y - 10, 20, 20);
            }
        }
    
        public GlassPane() {
            Thread handler = new Thread(deviceHandler);
            handler.start();
        }
    
        private Runnable deviceHandler = new Runnable() {
    
            @Override
            public void run() {
    
                Hub hub = new Hub("com.garbage");
    
                System.out.println("Attempting to find device...");
                Device externalDevice = hub.waitForDevice(10000);
    
                if (externalDevice == null) {
                    throw new RuntimeException("Unable to find device!");
                }
    
                System.out.println("Connected");
                DataCollector dataCollector = new DataCollector();
                hub.addListener(dataCollector);
    
                while (true) {
                    hub.run(1000/20); //gathers data and stores in dataCollector
                    roll = dataCollector.getRoll();
                    pitch = dataCollector.getPitch();
                    yaw = dataCollector.getYaw();
    
                    Point p = new Point();
                    p.setLocation(Math.abs(pitch) * 10, Math.abs(yaw) * 10);
                    setPoint(p);
    
                    repaint();
    
                }
            }
    
        };
    
    }
    

    我希望根据外部设备的方向在GUI上的某个位置绘制一个红色圆圈。在这一点上,我的“测试打印声明”甚至一次都没有发出。

    我的猜测是,我对Java的GlassPane缺乏某种基本的了解,甚至对paint、paintComponent和重新绘制的工作原理也缺乏了解。有人能指出我做错了什么吗?

    1 回复  |  直到 10 年前
        1
  •  3
  •   MadProgrammer    10 年前

    失败的可能原因是在将玻璃窗格设置为框架GlassPane之前,尝试将其设置为可见(默认情况下,Swing组件可见)。

    这个 JFrame 很可能会将玻璃窗格重置为不可见,这意味着它不会被绘制(无需绘制不可见的东西)

    将玻璃窗格应用于框架后,尝试将其设置为可见