2017-12-03 13 views
0

간단한 문제 : 저는 HDMI를 통해 TV에 연결 한 RaspPi3을 가지고 있으며, 전체 화면 (원격 클라이언트가 슬라이드 쇼로 간단한 텍스트를 보여주기 위해)에 Java Swing 응용 프로그램을 가지고 있습니다. 그러나 TV는 ~ 60 초 후에 대기 상태가되지만 앱이 작동중인 경우에만 대기합니다. TV를 단순히 표시하면 TV가 계속 살아있을 것입니다.Java Swing Window (전체 화면에서)가 Raspberry Pi 3의 HDMI 출력에 영향을 줍니까?

질문 : 전체 화면이 HDMI 신호로 어수선하게 흔들리지 않으므로 TV에서 더 이상 표시하고 종료 할 것이 없다고 생각합니까? (또는 텍스트를 표시하는 기능에 접근하는 방식에 문제가 있습니까? 아래 코드를 참조하십시오.)

신호가 동일하게 변하지 않거나 충분히 강하지 않기 때문에 TV에 문제가 있습니까? ~ 60 초 (화면이 대부분 검은 색이기 때문에 너무 많은 "빈"공간)?

참고 : 내 응용 프로그램은 의도 된대로 기능이 완벽하게 작동합니다. 이 대기 동작은 내가 예상하지 못한 "버그"입니다.

나는 HDMI 스펙에 대한 깊은 통찰력을 가지고 있지 않으므로 누구나이 문제를 해결하는 방법에 대한 힌트를 줄 수 있다면 고맙겠습니다.

이것은 내 첫 번째 질문이며, 내가 비슷한 문제를 발견하지 못했기 때문에 질문을하기로했습니다. 이 질문이 구체적 일지 확실하지는 않습니다. 그렇다면 미리 사과드립니다.

* 코드 :

public GUIController() 
    { 
     Statics.GUIC = this; 
     jf = new JFrame("[email protected] " + Statics.VERSION_INFOS); 
     jf.setUndecorated((Statics.PROPERTIES.getProperty("p.undecorated").equals("true"))); 
     jf.setAlwaysOnTop(true); 
     jf.setLocation(Integer.parseInt(Statics.PROPERTIES.getProperty("p.pos.x")), Integer.parseInt(Statics.PROPERTIES.getProperty("p.pos.y"))); 
     jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     Container cp = jf.getContentPane(); 
     MyCanvas tl = new MyCanvas(); 
     tl.setBackground(Color.BLACK); 
     cp.add(tl); 
     cp.setBackground(Color.BLACK); 
     jf.setSize(Integer.parseInt(Statics.PROPERTIES.getProperty("p.width")), Integer.parseInt(Statics.PROPERTIES.getProperty("p.height"))); 
     jf.setVisible(true); 
     t = 0; 

     timer = new Timer(100, new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       //check cmd 
       switch (Statics.PRESENTATION_CMD) 
       { 

        case Statics.REND_CMD_EMPTY: 

         Statics.PRESENTATION_CMD = Statics.REND_CMD_RUN; 
         break; 

        case Statics.REND_CMD_RUN: 
         break; 

        case Statics.REND_CMD_START: 
         tl.repaint(); 
         Statics.PRESENTATION_CMD = Statics.REND_CMD_RUN; 
         break; 

        case Statics.REND_CMD_STOP: 
         Statics.PRESENTATION_CMD_ADD = null; 
         tl.repaint(); 
         Statics.PRESENTATION_CMD = Statics.REND_CMD_EMPTY; 
         break; 

        case Statics.REND_CMD_NEXT: 

         Statics.PRESENTATION_CMD = Statics.REND_CMD_RUN; 
         break; 

        case Statics.REND_CMD_PREV: 

         Statics.PRESENTATION_CMD = Statics.REND_CMD_RUN; 
         break; 

        case Statics.REND_CMD_GOTO: 

         Statics.PRESENTATION_CMD = Statics.REND_CMD_RUN; 
         break; 
       } 
      } 
     }); 

     jf.addWindowListener(new WindowListener() 
     { 
      @Override 
      public void windowOpened(WindowEvent e) 
      { 
      } 

      @Override 
      public void windowClosing(WindowEvent e) 
      { 
       timer.stop(); 
      } 

      @Override 
      public void windowClosed(WindowEvent e) 
      { 
      } 

      @Override 
      public void windowIconified(WindowEvent e) 
      { 
      } 

      @Override 
      public void windowDeiconified(WindowEvent e) 
      { 
      } 

      @Override 
      public void windowActivated(WindowEvent e) 
      { 
      } 

      @Override 
      public void windowDeactivated(WindowEvent e) 
      { 
      } 
     }); 
     timer.setInitialDelay(1000); 
     timer.start(); 
    } 

    public void toggleVisibility() 
    { 
     jf.setVisible(!jf.isVisible()); 
    } 
} 

class MyCanvas extends JComponent 
{ 

    int fontSize = 50; 
    Font font = new Font("Calibri", Font.PLAIN, fontSize); 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     if (g instanceof Graphics2D) 
     { 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

      if (Statics.PRESENTATION_CMD_ADD == null && Connection.getInstance().hasConnected()) 
      { 
       g2.setColor(Color.GREEN); 
       g2.setFont(font); 

       g2.drawString("connected", 50, 50); 
       return; 
      } 
      else if (Statics.PRESENTATION_CMD_ADD == null) 
      { 

       g2.setColor(Color.GREEN); 
       g2.setFont(font); 

       g2.drawString("not connected", 50, 50); 
       return; 
      } 

      String[] content = Statics.PRESENTATION_CMD_ADD.split(Statics.STRING_LIMITER_HASH); 

      g2.setColor(Color.WHITE); 
      g2.setFont(font); 
      for (int i = 0; i < content.length; i++) 
      { 
       g2.drawString(content[i], 50, fontSize + fontSize * i + 10); 
      } 
     } 
    } 
} 

답변

0

내가 언급을 아직 충분히 명성을 가지고 있지 않기 때문에 답변으로 게시해야합니다.

나는 코드를 보지 못했지만 Pi에서 작업 할 때 비슷한 문제가 있었는데 이미지 오버레이 (디지털 신호)가있는 비디오를 표시하고있었습니다. 내가 전체 화면으로 갈 때 화면이 검정색으로 바뀌고 결국 시간이 초과되고 화면이 대기 모드로 전환되기 전에 이미지 깜박임이 발생합니다.

hdmi 버퍼 또는 기타 문제가있는 것으로 나타났습니다. 나는 실제로 내 문제를 해결하지 못했는데, 나는 라즈베리 파이의 한계에 맞았다 고 생각한다.

해상도를 낮추는 작업이 무엇 이었습니까? config.txt에서 sd 카드 이미지에 나는 hdmi 모드를 34로 변경했다고 생각하는데, 이것은 30hz에서 1920x1280p를 주었고 60hz에 반대하여 본질적으로 버퍼를 두 배로 늘렸다. 약간의 품질 저하가 있었지만 거의 눈에 띄지 않았습니다.

죄송합니다. 더 도움이되지 않을 수 있습니다. 올바른 방향으로 이동할 수 있도록 제 2 센트를 추가하겠습니다.