Этот вопрос может быть простым вопросом, когда мне не хватает фундаментального понимания Java Swing или Graphics, и если да, извиняюсь.JFrame and GlassPane - Проблема с перерисовкой()
Я пытаюсь разработать приложение GUI с использованием Java Swing, которое может управляться внешним устройством, которое отправляет значения тона, рыскания и рулона через bluetooth в приложение. Моя идея - создать курсор (возможно, пустой круг), который перемещается, когда внешнее устройство перемещается. У меня нет проблем с получением данных с устройства, только той части, где мне нужно нарисовать что-то поверх всех моих компонентов.
Я понял, что GlassPane был самым простым способом показать курсор над всем приложением и заставить его перемещаться, когда внешнее устройство перемещается. Я использую Thread для захвата данных, и я пытаюсь вызвать 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();
}
}
};
}
То, что я хотел бы случиться на красный круг, который можно сделать где-то на графический интерфейс в зависимости от ориентации внешнего устройства. На данный момент моя «тестовая распечатка» не срабатывает даже один раз.
Я предполагаю, что мне не хватает какого-то базового понимания GlassPane Java или даже того, как рисуются краски, paintComponent и перекрашиваются даже работы. Может ли кто-нибудь указать, что я делаю неправильно?
Запрашивается ли setPoint? Ваш Runnable попадает в цикл while? – MadProgrammer
@MadProgrammer да, делает. –
Единственные две причины, по которым я могу видеть, что ваш оператор печати не печатает, - это потому, что точка равна нулю или вы насытили edt – MadProgrammer