【问题标题】:Does a Java Swing Window (in Fullscreen) affect the HDMI output of a Raspberry Pi 3?Java Swing 窗口(全屏)是否会影响 Raspberry Pi 3 的 HDMI 输出?
【发布时间】:2017-12-03 13:14:51
【问题描述】:

简单的问题:我有一个 RaspPi3 连接到电视(通过 HDMI)和一个全屏的 java Swing 应用程序(远程客户端以幻灯片形式显示简单文本)。然而,电视会在大约 60 秒后进入待机状态,但前提是我的应用程序正在运行。如果我只是显示桌面,电视就会保持活力。

问题是:全屏摇摆应用程序是否会干扰 HDMI 信号,以致电视认为没有更多内容可显示并关闭? (或者我处理显示文本功能的方式有问题吗?见下面的代码*)

或者是电视有问题,因为信号保持不变并且没有变化,或者在大约 60 秒内不够强(“空白”空间过多,因为屏幕大部分是黑色的)?

注意:我的应用在纯粹的功能基础上确实按预期工作。这种待机行为是我没想到的“错误”。

我对 HDMI 规范没有那么深入的了解,所以如果有人能给我关于如何解决这个问题的提示,我将不胜感激。

这是我的第一个问题,我决定问它,因为我没有发现任何与我类似的问题。我不完全确定这个问题是否具体,所以如果是,我提前道歉。

*代码:

public GUIController()
    {
        Statics.GUIC = this;
        jf = new JFrame("SP-MultiMonitor@arm " + 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);
            }
        }
    }
}

【问题讨论】:

    标签: java swing hdmi


    【解决方案1】:

    我还没有足够的声誉来发表评论,所以需要发布作为答案。

    我什至没有看过你的代码,但不久前在 Pi 上工作时我遇到了类似的问题,我正在显示带有图像叠加(数字标牌)的视频。当我进入全屏模式时,我会在屏幕变黑之前看到图像闪烁,最终超时,屏幕将进入待机状态。

    原来是 hdmi 缓冲区或其他问题。我从来没有真正解决过我的问题,我想我只是达到了树莓派的极限。

    有效的方法是降低分辨率。在 sd 卡图像上的 config.txt 中,我认为我将 hdmi 模式更改为 34,这给了我 30hz 的 1920x1280p 和 60hz 的对比,基本上使缓冲区加倍。质量略有下降,但几乎看不到。

    抱歉,我无法提供更多帮助,我只是想加我的 2cents,以防它把你推向正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 2013-10-16
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多