Есть ли способ скрыть строку заголовка, но сохранить кнопки в JFrame - PullRequest
0 голосов
/ 22 апреля 2020

Мне было интересно, смогу ли я скрыть строку заголовка в Java Swing, но сохранить кнопки увеличения, минимизации и закрытия.

Я пытался добавить frame.setUndecorated(true);, но он удаляет максимизировать, сверните и закройте кнопки полностью.

Вот мой код:

public Display(String title, int width, int height) {
        Display.width = width;
        Display.height = height;

        Display.absWidth = width;
        Display.absHeight = height;

        Display.d = new Dimension(width, height);

        setProperties();

        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        canvas = new Canvas();
        canvas.setPreferredSize(new Dimension(width, height));

        frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        frame.setLayout(new BorderLayout());
        frame.add(canvas, BorderLayout.CENTER);
        frame.setIgnoreRepaint(true);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setResizable(true);

        canvas.createBufferStrategy(2);
        bs = canvas.getBufferStrategy();
        g = bs.getDrawGraphics();

        frame.getRootPane().putClientProperty("apple.awt.fullWindowContent", true);
        frame.getRootPane().putClientProperty("apple.awt.transparentTitleBar", true);

        frame.setVisible(true);

        handleResize();
        handleQuit();

        //showSplashScreen();
    }

1 Ответ

1 голос
/ 22 апреля 2020

Если вы хотите сохранить собственные кнопки, это зависит от операционной системы.

  • Windows: Нет, вам придется использовать frame.setUndecorated(true); и копировать кнопки самостоятельно. Тогда это будет работать на всех платформах, но для достижения собственного внешнего вида вам нужно будет реализовать его для каждой отдельно.
  • macOS: если вы используете jdk 12 или новее, вы можете добиться этого с помощью:
rootPane.putClientProperty(“apple.awt.fullWindowContent“, true);
rootPane.putClientProperty(“apple.awt.transparentTitleBar“, true);

Это взято из тестовых примеров jdk:

SwingUtilities.invokeLater(() -> {
    frame = new JFrame("Test");
    frame.setBounds(200, 200, 300, 100);
    rootPane = frame.getRootPane();
    JComponent contentPane = (JComponent) frame.getContentPane();
    contentPane.setBackground(Color.RED);
    rootPane.putClientProperty("apple.awt.fullWindowContent", true);
    rootPane.putClientProperty("apple.awt.transparentTitleBar", true);
    frame.setVisible(true);
});

Обратите внимание, что все создание и изменение пользовательского интерфейса должно происходить в главном потоке Swing с использованием SwingUtilities#invokeLater или SwingUtilities#invokeAndWait .

Какова ваша цель в удалении строки заголовка, но при удерживании кнопок?

...