2014-09-13 2 views
0

Этот вопрос может быть простым вопросом, когда мне не хватает фундаментального понимания 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 и перекрашиваются даже работы. Может ли кто-нибудь указать, что я делаю неправильно?

+0

Запрашивается ли setPoint? Ваш Runnable попадает в цикл while? – MadProgrammer

+0

@MadProgrammer да, делает. –

+0

Единственные две причины, по которым я могу видеть, что ваш оператор печати не печатает, - это потому, что точка равна нулю или вы насытили edt – MadProgrammer

ответ

2

Вероятная причина вашего разочарования заключается в том, чтобы установить прозрачность стекла (компоненты Swing видны по умолчанию), прежде чем устанавливать его как рамки GlassPane.

JFrame, вероятно, сброс стеклянной панели, чтобы быть невидимым, а это означает, что он не будет окрашен (не точка живописи то, что не видно)

Попробуйте установить панель из стекла видна после установки его на раме

Смежные вопросы