全屏Java中的JFrame
我将很快做一个项目,我将不得不使用全屏模式。
它会在窗口中绘制一些graphics。 如果我使用JFrame或类似的东西,会很方便。
我不知道屏幕的最终分辨率是什么。 请告诉我,如果graphics将被自动重新调整?
JFrame jf = new JFrame(); jf.setSize(1650,1080); //make it fullscreen; //now is everything is going to be rescaled so it looks like the original?
加:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true); frame.setVisible(true);
如果你想把你的画面放在全屏幕模式(比如全屏幕的电影),请检查这些答案。
- 我怎样才能在OSX上的Java全屏幕
- Java setFullScreenWindow()保持在最前面
类java.awt.GraphicsEnvironment
和java.awt.GraphicsDevice
用于在全屏模式下将应用程序放置在一个屏幕上(表示方式)。
例如:
static GraphicsDevice device = GraphicsEnvironment .getLocalGraphicsEnvironment().getScreenDevices()[0]; public static void main(String[] args) { final JFrame frame = new JFrame("Display Mode"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setUndecorated(true); JButton btn1 = new JButton("Full-Screen"); btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { device.setFullScreenWindow(frame); } }); JButton btn2 = new JButton("Normal"); btn2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { device.setFullScreenWindow(null); } }); JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER)); panel.add(btn1); panel.add(btn2); frame.add(panel); frame.pack(); frame.setVisible(true); }
使用setExtendedState(int state)
,其中状态是JFrame.MAXIMIZED_BOTH
。
一种方法是使用扩展状态。 这要求底层操作系统最大化JFrame。
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
其他的办法是手动最大化你的要求屏幕。
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight()); setLocationRelativeTo(null);
但是这在Ubuntu操作系统中有缺陷。 我发现的工作是这样的。
if (SystemHelper.isUnix()) { getContentPane().setPreferredSize( Toolkit.getDefaultToolkit().getScreenSize()); pack(); setResizable(false); show(); SwingUtilities.invokeLater(new Runnable() { public void run() { Point p = new Point(0, 0); SwingUtilities.convertPointToScreen(p, getContentPane()); Point l = getLocation(); lx -= px; ly -= py; setLocation(p); } }); } Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight()); setLocationRelativeTo(null);
在Fedora中,上述问题不存在。 但是Gnome或者KDE有一些复杂的问题。 所以最好小心点。 希望这可以帮助。
只要使用这个代码:
import java.awt.event.*; import javax.swing.*; public class FullscreenJFrame extends JFrame { private JPanel contentPane = new JPanel(); private JButton fullscreenButton = new JButton("Fullscreen Mode"); private boolean Am_I_In_FullScreen = false; private int PrevX, PrevY, PrevWidth, PrevHeight; public static void main(String[] args) { FullscreenJFrame frame = new FullscreenJFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 500); frame.setVisible(true); } public FullscreenJFrame() { super("My FullscreenJFrame"); setContentPane(contentPane); // From Here starts the trick FullScreenEffect effect = new FullScreenEffect(); fullscreenButton.addActionListener(effect); contentPane.add(fullscreenButton); fullscreenButton.setVisible(true); } private class FullScreenEffect implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { if (Am_I_In_FullScreen == false) { PrevX = getX(); PrevY = getY(); PrevWidth = getWidth(); PrevHeight = getHeight(); // Destroys the whole JFrame but keeps organized every Component // Needed if you want to use Undecorated JFrame dispose() is the // reason that this trick doesn't work with videos. dispose(); setUndecorated(true); setBounds(0, 0, getToolkit().getScreenSize().width, getToolkit().getScreenSize().height); setVisible(true); Am_I_In_FullScreen = true; } else { setVisible(true); setBounds(PrevX, PrevY, PrevWidth, PrevHeight); dispose(); setUndecorated(false); setVisible(true); Am_I_In_FullScreen = false; } } } }
我希望这有帮助。
最简单的修复:
for (Window w : Window.getWindows()) { GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(w); }
值得强调的是我的意思是:
! JFrame – 属性
它会帮助你在框架的瞬间使用你的对象
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
在下面设置2个属性:
- extendedState = 6
- resizeable = true
这个对我有用。