2012-07-19 8 views
79

Ich werde bald ein Projekt machen und ich werde Vollbildmodus darin verwenden müssen.JFrame im Vollbild Java

Es wird einige Grafiken im Fenster zeichnen. Es wäre praktisch, wenn ich JFrame oder etwas ähnliches verwenden würde.

Ich weiß nicht, wie die endgültige Auflösung des Bildschirms sein wird. Bitte sagen Sie mir, ob die Grafik automatisch skaliert wird?

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

Sie müssen "Vollbild" definieren. Zusammen mit den Antworten unten sollten Sie überlegen, ob der Rahmen dekoriert werden soll oder nicht (dh die Titelleiste und Rahmen). Wenn Sie keine benutzerdefinierte Bemalung durchführen, wird keine Neuskalierung durchgeführt. Wenn Sie normale Swing-Komponenten und einen Layout-Manager verwenden, sollten Sie feststellen, dass sich das Layout an die neue Bildschirmauflösung anpasst. Natürlich wirst du es testen wollen;) – MadProgrammer

+0

Willst du Lion Fullscreen verwenden? – LanguagesNamedAfterCofee

Antwort

155

Anzahl:

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

Auch 'frame.setUndcorated (true);' wird es wirklich Vollbild machen. – Yoda

+0

Es funktioniert gut :) – Eagle

+0

Wenn Sie GNU/Linux verwenden, müssen Sie möglicherweise 'DisplayMode.BIT_DEPTH_MULTI' und' DisplayMode.REFRESH_RATE_UNKNOWN' einstellen, wenn Sie einen neuen Anzeigemodus anwenden. Ich musste 'setExtendedState' nicht verwenden. Getestet mit Kubuntu 15.10 mit Java 8. – ray

30

Wenn Sie Ihre Frame-Modus in Vollbild setzen wollen (wie ein Film im Vollbildmodus), überprüfen Sie diese Antworten.

Die Klassen java.awt.GraphicsEnvironment und java.awt.GraphicsDevice sind für eine App im Vollbildmodus auf dem einen Bildschirm (das Dispositiv) setzen verwendet.

z.B .:

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

Für [Beispiel] (http://stackoverflow.com/a/7457102/230513). – trashgod

+0

@Paul Vargas: Sie können sogar eine Menüleiste in einem undekorierten Fenster hinzufügen. Zum Beenden müssen Sie in Ihrem Beispiel "alt + F4" eingeben. – cardman

6

Eine Möglichkeit ist ausgefahrenem Zustand zu verwenden. Dies fordert das zugrunde liegende Betriebssystem auf, den JFrame zu maximieren.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 

Andere Vorgehensweise wäre, den Bildschirm für Ihre Anforderung manuell zu maximieren.

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

Aber das hat Tücken in Ubuntu OS. Die Arbeit, die ich fand, war diese.

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

In Fedora ist das obige Problem nicht vorhanden. Aber es gibt Komplikationen mit Gnome oder KDE beteiligt. Also pass besser auf. Hoffe das hilft.

5

Verwenden Sie einfach diesen Code:

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

Ich hoffe, das hilft.

+2

@endian Bitte ändern Sie nicht den Code der Menschen. Wenn Sie das Gefühl hatten, dass etwas geändert werden muss, kommentieren Sie das hier und PeGiannOS kann sich das ansehen. Wenn sie es nicht ändern möchten, können Sie immer eine neue Antwort eingeben, wenn Sie es für wichtig halten. –

-1

Set 2 Eigenschaften unter:

  1. extendedState = 6
  2. resizeable = true

Es funktioniert für mich.

+2

Endgültige Statik gibt es aus einem bestimmten Grund. – Yoda

+0

Hmmmm ... In netBeans 8.0.1 kann ich JFrame für Werte von "resizeable" + "resizeable" Eigenschaften (Eigenschaften Windows) setzen –

0

Werte hervorgehoben, dass ich meine:

! JFrame - Properties

+0

während das Bild implizit eine Antwort liefern kann, bitte versuchen Sie auch, Ihre Antwort mit einer Erklärung zu erarbeiten. Imho, aber, da Ihre Antwort tatsächlich die gleiche ist wie die bestehende, denken Sie bitte sorgfältig darüber nach, ob Sie diese Antwort wirklich ausarbeiten und behalten möchten oder nicht. –

2

einfachste Lösung überhaupt:

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

Was ist der Unterschied zwischen 'frame.setExtendedState (JFrame.MAXIMIZED_BOTH);' und Ihrer Lösung? – Yoda

+0

Sie müssen einen Rahmen für Ihre Lösung haben. Während für meine Sie nicht und es wird automatisch durch alle Fenster im Programm durchlaufen –

2

wird es hilft Ihnen, Ihr Objekt Augenblick des Rahmens verwenden

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

0

Zunächst einmal, dass die Auflösung Sie verwenden wollen würde, 1650,1080.

Nun fügen:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Wenn Sie Probleme mit den Komponenten auf dem JFrame haben, dann, nachdem Sie die Komponenten mit der frame.add(component) Methode all hinzugefügt haben, die folgende Anweisung hinzufügen.

frame.pack();