当按下 f11 时,如何使 window 全屏显示?

when f11 is pressed how can i make the window fullscreen?

import javax.swing.JFrame;

import java.awt.Color;

public class Main extends JFrame{

    public static void main(String[] args) {
        Main window = new Main();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(200, 200);
        window.setVisible(true);
        window.setTitle("Virtual World");
        window.setResizable(true);
        window.getContentPane().setBackground(Color.BLACK);
    }

}

我该怎么做才能使 F11 使 window 进入和退出全屏?

我通读了其他问题并尝试使用 window.setUndecorated(true); 但它似乎没有做任何事情...

我使用以下:

public static final void addKeyBinding(JComponent c, String key, final Action action) {
    c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key);
    c.getActionMap().put(key, action);
    c.setFocusable(true);
}

示例:

public static void main(String[] args) {
    final JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JPanel());
    frame.setSize(600, 400);
    frame.setVisible(true);

    addKeyBinding(frame.getRootPane(), "F11", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int state = frame.getExtendedState();

            if (state == JFrame.MAXIMIZED_BOTH) {
                state = JFrame.NORMAL;
            } else {
                state = JFrame.MAXIMIZED_BOTH;
            }

            frame.setExtendedState(state);
        }
    });
}

要使 JFrame 真正全屏,您必须将其设置为未修饰。但是要将其设置为未装饰的,您必须先处理它。例如

class FullscreenToggleAction extends AbstractAction {

  private JFrame frame;
  private GraphicsDevice fullscreenDevice;

  public FullscreenToggleAction (JFrame frame) {
    this(frame, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice());
  }

  public FullscreenToggleAction (JFrame frame, GraphicsDevice fullscreenDevice) {
    this.frame = frame;
    this.fullscreenDevice = fullscreenDevice;
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    frame.dispose();

    if (frame.isUndecorated()) {
      fullscreenDevice.setFullScreenWindow(null);
      frame.setUndecorated(false);
    } else {
      frame.setUndecorated(true);
      fullscreenDevice.setFullScreenWindow(frame);
    }

    frame.setVisible(true);
    frame.repaint();
  }
}

然后只需添加键绑定

public class Main {

  public static final void addKeyBinding(JComponent c, String key, final Action action) {
    c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key);
    c.getActionMap().put(key, action);
    c.setFocusable(true);
  }

  public static void main(String[] args) {
    final JFrame frame = new JFrame("Fullscreen Toggle Test");

    Container contentPane = frame.getContentPane();
    contentPane.add(new JLabel("Toogle fullscreen using F11"), BorderLayout.CENTER);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 400);
    frame.setVisible(true);

    addKeyBinding(frame.getRootPane(), "F11", new FullscreenToggleAction(frame));
  }
}

您还可以在不同的 GraphicsDevice 上全屏显示。例如。在多显示器环境中

GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screenDevices = localGraphicsEnvironment.getScreenDevices();

addKeyBinding(frame.getRootPane(), "F11", new FullscreenToggleAction(frame, screenDevices[1]));