2012-07-19 77 views
79

我將很快做一個項目,我將不得不使用全屏模式。JFrame全屏Java

它會在窗口中繪製一些圖形。如果我使用JFrame或類似的東西,會很方便。

我不知道屏幕的最終分辨率是什麼。請告訴我,圖形是否會自動重新縮放?

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? 
+0

您需要定義「全屏」。隨着下面的答案,你可能要考慮框架是否應該裝飾(包括標題欄和邊框)。除非您正在執行自定義繪畫,否則不會重新縮放。如果您使用普通的Swing組件和佈局管理器,則應該會發現佈局會調整爲新的屏幕分辨率。當然,你會想測試它;) – MadProgrammer 2012-07-20 00:17:35

+0

你想使用獅子全屏? – LanguagesNamedAfterCofee 2012-07-20 02:39:26

回答

155

地址:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true); 
frame.setVisible(true); 
+36

另外'frame.setUndecorated(true);'將使它真正全屏。 – Yoda 2014-10-15 11:03:25

+0

效果不錯:) – Eagle 2015-04-24 17:42:15

+0

如果您使用的是GNU/Linux,則在應用新的顯示模式時可能需要設置DisplayMode.BIT_DEPTH_MULTI和DisplayMode.REFRESH_RATE_UNKNOWN。我不必使用'setExtendedState'。測試使用Kubuntu 15.10和Java 8. – ray 2016-01-16 20:54:12

30

如果你想要把你的幀全屏模式(像電影中的全屏幕),檢查這些答案。

的類java.awt.GraphicsEnvironmentjava.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); 

} 
+1

For [example](http://stackoverflow.com/a/7457102/230513)。 – trashgod 2012-07-20 00:32:56

+0

@Paul Vargas:你甚至可以在未裝飾的窗口上添加一個菜單欄。在你的例子中,你必須輸入「alt + F4」來退出。 – cardman 2017-01-05 10:16:06

6

的一種方法是使用擴展狀態。這要求底層操作系統最大化JFrame。

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 

其他方法是手動最大化屏幕爲您的要求。

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight()); 
    setLocationRelativeTo(null); 

但是這在Ubuntu OS中有缺陷。我發現的工作就是這樣。

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(); 
       l.x -= p.x; 
       l.y -= p.y; 
       setLocation(p); 
      } 
     }); 

    } 
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight()); 
    setLocationRelativeTo(null); 

在Fedora中上述問題不存在。但是GnomeKDE涉及併發症。所以最好小心。希望這可以幫助。

5

只需使用此代碼:

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; 
      } 
     } 
    } 
} 

我希望這有助於。下面

+2

@endian請不要改變人的代碼。如果您覺得需要改變的地方,請在這裏留言,PeGiannOS可以看看。如果他們不想改變它,如果你覺得它很重要,你可以隨時提供一個新的答案。 – 2014-02-07 10:07:35

-1

設置2個屬性:

  1. extendedState = 6
  2. 調整大小=真

這對我的作品。

+2

最後的靜力學是有原因的。 – Yoda 2014-11-14 09:12:46

+0

Hmmmm ...在netBeans 8.0.1中,我可以爲JFrame設置「resizeable」+「resizeable」屬性(屬性窗口)值 – 2014-11-18 03:42:58

0

數值突出顯示我的意思是:

JFrame - Properties

+0

,同時圖片可以隱式提供答案,請嘗試用一些解釋來闡述您的答案。儘管如此,因爲你的答案實際上與現有的答案是一樣的,請仔細考慮你是否真的想詳細說明並保留這個答案。 – 2014-11-18 04:43:49

2

最簡單的解決不斷:

   for (Window w : Window.getWindows()) { 
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(w); 
       } 
+0

'frame.setExtendedState(JFrame.MAXIMIZED_BOTH);'和你的解決方案有什麼區別? – Yoda 2016-01-31 20:13:18

+0

你必須有一個解決方案的框架。而對於我而言,你不會,它會自動循環遍歷程序中的所有窗口 – 2016-02-01 21:15:43

2

它會幫助您使用框架

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

0

首先,你的目標瞬間,那是你想使用的分辨率, 1650,1080

現在添加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

如果你有對的JFrame組件,您添加使用frame.add(component)方法的所有部件,然後後的問題,添加以下語句。

frame.pack();