2012-07-19 25 views
79

Farò presto un progetto e dovrò utilizzare la modalità a schermo intero .JFrame a schermo intero Java

Disegna alcuni elementi grafici nella finestra. Sarebbe comodo se io uso JFrame o qualcosa di simile.

Non so quale sarà la risoluzione finale dello schermo. Per favore, dimmi se la grafica verrà automaticamente riscalata?

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

È necessario definire "schermo intero". Insieme alle risposte di seguito, potresti decidere se il riquadro deve essere decorato o meno (ovvero include la barra del titolo e i bordi). A meno che non si esegua la verniciatura personalizzata, non si verificherà il ridimensionamento. Se stai usando i normali componenti Swing e un gestore di layout, dovresti trovare che il layout si adatta alla nuova risoluzione dello schermo. Ovviamente vorrete provarlo;) – MadProgrammer

+0

Volete usare Lion Fullscreen? – LanguagesNamedAfterCofee

risposta

155

Add:

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

Anche 'frame.setUndecorated (true);' lo renderà veramente a schermo intero. – Yoda

+0

Funziona bene :) – Eagle

+0

Se si utilizza GNU/Linux, potrebbe essere necessario impostare 'DisplayMode.BIT_DEPTH_MULTI' e' DisplayMode.REFRESH_RATE_UNKNOWN' quando si applica una nuova modalità di visualizzazione. Non ho dovuto usare 'setExtendedState'. Testato utilizzando Kubuntu 15.10 con Java 8. – ray

30

Se si vuole mettere il telaio in modalità a schermo intero (come un film a schermo intero), controllare queste risposte.

Le classi java.awt.GraphicsEnvironment e java.awt.GraphicsDevice sono utilizzati per mettere un app in modalità a schermo intero, da una schermata (la dispositiva).

es .:

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

Per [esempio] (http://stackoverflow.com/a/7457102/230513). – trashgod

+0

@Paul Vargas: è anche possibile aggiungere una barra dei menu in una finestra non decorata. Per uscire, nel tuo esempio, devi digitare "alt + F4". – cardman

6

Un modo è quello di utilizzare lo Stato esteso. Ciò richiede al sistema operativo sottostante di massimizzare JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 

Un altro approccio sarebbe quello di massimizzare manualmente lo schermo per voi requisito.

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

Ma questo ha insidie ​​in Ubuntu OS. Il lavoro che ho trovato è stato questo.

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 il problema di cui sopra non è presente. Ma ci sono complicazioni coinvolte con Gnome o KDE. Quindi meglio stare attento. Spero che questo ti aiuti.

5

Proprio di questo codice:

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

Spero che questo aiuta.

+2

@endian per favore non cambiare il codice della gente. Se senti che qualcosa deve essere cambiato, commenta qui e PeGiannOS può dare un'occhiata. Se non vogliono cambiarlo, puoi sempre fornire una nuova risposta se ritieni che sia importante. –

-1

Set 2 appartamenti qui sotto:

  1. extendedState = 6
  2. ridimensionabile = true

Funziona per me.

+2

Le statiche finali ci sono per un motivo. – Yoda

+0

Hmmmm ... In netBeans 8.0.1 Posso impostare JFrame per i valori delle proprietà "ridimensionabili" + "ridimensionabili" (finestre delle proprietà) –

0

Valori hanno evidenziato che voglio dire:

! JFrame - Properties

+0

mentre l'immagine può fornire una risposta implicita, prova a elaborare anche la tua risposta con qualche spiegazione. imho, però, dal momento che la tua risposta è in realtà la stessa di quella esistente, ti preghiamo di riflettere attentamente se vuoi davvero elaborare e mantenere questa risposta oppure no. –

2

più semplice fissare mai:

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

Qual è la differenza tra 'frame.setExtendedState (JFrame.MAXIMIZED_BOTH);' e la tua soluzione? – Yoda

+0

Devi avere una cornice per la tua soluzione. Considerando che per il mio non lo fai e passerà automaticamente in tutte le finestre del programma –

2

lo farà consente di utilizzare il vostro immediato oggetto del telaio

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

0

Prima di tutto, che è la risoluzione che si desidera utilizzare, 1650,1080.

Ora aggiungere:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Se avete problemi con i componenti sul JFrame, poi, dopo aver aggiunto tutti i componenti utilizzando il metodo frame.add(component), aggiungere la seguente istruzione.

frame.pack();