gpt4 book ai didi

java - JFrame 和 GlassPane - repaint() 遇到问题

转载 作者:行者123 更新时间:2023-12-02 05:27:55 26 4
gpt4 key购买 nike

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

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

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

相关代码如下:

JFrame:

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 缺乏某种基本的了解,甚至对 Paint、paintComponent 和 repaint 的工作原理缺乏一些基本的了解。谁能指出我做错了什么?

最佳答案

让您感到沮丧的可能原因是在将玻璃 Pane 设置为框架 GlassPane 之前尝试将玻璃 Pane 设置为可见(默认情况下 Swing 组件是可见的)。

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

尝试将玻璃板应用到框架后将其设置为可见

关于java - JFrame 和 GlassPane - repaint() 遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com