0

这个问题可能是我对 Java Swing 或 Graphics 缺乏基本了解的简单问题,如果是这样,我深表歉意。

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

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

以下是相关代码:

框架:

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 */
    }
}

还有我的 GlassPane:

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 的某种基本了解,甚至对绘画、绘画组件和重画的工作原理都缺乏了解。谁能指出我做错了什么?

4

1 回答 1

3

您感到沮丧的可能原因是尝试将玻璃窗格设置为可见(Swing 组件默认可见),然后将其设置为框架 GlassPane。

JFrame可能会将玻璃窗格重置为不可见,这意味着它不会被绘制(没有必要绘制不可见的东西)

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

于 2014-09-13T21:21:39.330 回答