【发布时间】:2014-11-07 18:06:22
【问题描述】:
这个问题可能是我对 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 的某种基本了解,甚至对绘画、绘画组件和重绘的工作原理都缺乏了解。谁能指出我做错了什么?
【问题讨论】:
-
setPoint 是否被调用?你的 Runnable 是否进入了 while 循环?
-
@MadProgrammer 是的,确实如此。
-
我可以看到您的打印语句没有打印的唯一两个原因是因为点为空或者您已经过度饱和 edt
-
@MadProgrammer 在检查点是否为空的行之前的打印语句也不会触发。
-
您应该同步调用 setPoint 或使 point volatile
标签: java swing jframe repaint glasspane