2013-02-14 16 views
5

Originariamente (Vedere la mia domanda precedente "Java how to make JFrames start off as a maximised window") Volevo creare una finestra che partisse al massimo. Questo codice realizza questo:Java come rendere i JFrames massimizzati ma non ridimensionabili

public static void main(String[] args) { 

JFrame frame = new JFrame(); 
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

} 

Tuttavia, se questa finestra viene ripristinata verso il basso si trasforma in un bar praticamente inesistente. Per risolvere questo ho impostato una dimensione per la finestra usando setSize(). Funziona ma presenta un altro problema, la finestra può ancora essere ridimensionata.

Per risolvere questo problema ho impostato setResizable (false); e questo è il mio codice finora:

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

Tuttavia, ora la finestra inizia con le dimensioni specificate (piuttosto che massimizzato) e non può essere ripristinato in su.

Quindi, la mia domanda è: come posso rendere massiccia la finestra di avvio, dargli una dimensione per quando viene ripristinata e rendere impossibile ridimensionarlo? O fare una finestra che inizia al massimo e non può essere ripristinata?

risposta

3

C'è una semplice correzione che funziona quasi tutto il tempo: rendere il vostro telaio non ridimensionabile dopo aver impostato visibile. Quindi modifica solo il codice in questo modo:

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setVisible(true); // FIRST visible = true 
    frame.setResizable(false); // THEN resizable = false 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

In questo modo, il telaio verrà avviato massimizzato e il pulsante di ingrandimento non è selezionabile, impedendo all'utente di utilizzarlo. (Non so davvero perché devi farlo. Suppongo che lo stato massimizzato sia realmente applicato solo quando la finestra diventa visibile, e se lo rendi prima irriconoscibile, non si applica.)

Funziona quasi per tutto il tempo, perché su Windows 7 puoi almeno far uscire la finestra dallo stato ingrandito facendo clic sulla barra del titolo e trascinandola. Ma sarà alle dimensioni che hai impostato prima. Il problema è che il tuo utente non sarà in grado di massimizzarlo di nuovo, e non ho trovato il modo con gli ascoltatori per riportare la finestra allo stato ingrandito. (Modifica: @David Kroukamp mostra nell'ultima parte della sua risposta che è possibile forzare lo stato massimizzato utilizzando un ComponentListener. Pertanto non è necessario utilizzare setResizable(false) In questo modo si ha ancora un problema con Windows 7 perché l'azione di trascinamento non è catturato da questo evento per qualsiasi motivo, ma gli utenti saranno in grado di utilizzare il pulsante massimizzata per rimetterlo dove dovrebbe essere.)

Ora, non v'è quasi una ragione per fare questo tipo di cose. Gli utenti non amano molto quando impedisci loro di manipolare le loro finestre (le finestre ingrandite non possono essere spostate, per esempio, e questo può essere fastidioso quando hai più schermi). Un'eccezione è se stai facendo un gioco, che è in genere a schermo intero. Ma allora non vorresti un JFrame perché non vuoi tutte le decorazioni, ma una finestra.

Se il problema è che la dimensione della finestra predefinita è molto piccola, è normale. Devi prima mettere qualcosa nella cornice (alcuni controlli, pulsanti, quello che vuoi nella tua applicazione), usare i layout (quello è importante), quindi chiamare il metodo pack() sulla tua cornice. Sceglierà una bella dimensione predefinita per la tua finestra.

Infine, un'ultima parola. Ho inserito il mio codice di esempio in un metodo main come scorciatoia, ma dovresti sempre utilizzare Swing nello Swing EDT utilizzando SwingUtils.invokeLater().

+1

Grazie mille! Questo funziona. Ad essere onesto con te, ho appena iniziato a guadagnare swing quindi volevo solo essere in grado di farlo piuttosto che applicarlo a qualsiasi cosa! Grazie ancora! –

0

In quale ambiente si sta eseguendo? Ho provato questo con JDK1.6/JDK1.7 sotto Win7 e funziona come previsto (finestra inizia al massimo, riduce al minimo la barra delle applicazioni).

+0

Sto parlando del pulsante centrale, "ripristina". Niente a che vedere con minimizzare. Esegui il codice senza il setResizable e vedrai come voglio che inizi. –

1

A volte è necessario fare attenzione all'ordine in cui si impostano i parametri JFrame.

Inoltre, è necessario utilizzare i componenti Swing nel thread di invio eventi.

Prova questo e vedere se aiuta.

public static void main(String[] args) {   
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Jedia"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(screenSize); 
      frame.setResizable(false); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

No quella finestra non è ingrandita. Può ancora essere trascinato e il pulsante di ripristino è inutilizzabile. Grazie comunque. –

0

Ho una specie di trucco per te che potrebbe funzionare. Prova questo codice (ha funzionato per me):

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Jedia"); 
    frame.setMinimumSize(new Dimension(600, 400)); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    frame.addComponentListener(new ComponentListener(){ 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentResized(ComponentEvent e) { 

      if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8")) 
      frame.setSize(new Dimension(600, 400)); 
     } 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 

e.paramString() restituisce una stringa simile a "COMPONENT_RESIZED (-8, -8, [Screensize])" quando un'azione ripristino avviene.