2013-02-14 10 views
5

Ursprünglich (Siehe meine vorherige Frage "Java how to make JFrames start off as a maximised window") Ich wollte ein Fenster erstellen, das maximiert startet. Dieser Code erreicht dies:Java wie man JFrames maximiert, aber nicht skalierbar macht

public static void main(String[] args) { 

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

} 

Wenn jedoch dieses Fenster wiederhergestellt wird nach unten wird es ein praktisch nicht existent bar. Um das zu lösen, setze ich eine Größe für das Fenster mit setSize(). Dies funktioniert aber stellt ein anderes Problem dar, das Fenster kann immer noch in der Größe verändert werden.

Um dieses Problem zu lösen, setze ich setResizable (false); und dies ist mein Code so weit:

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

} 

jedoch jetzt das Fenster beginnt bei seiner angegebenen Größe aus (statt maximiert) und kann nicht gestellt werden.

Also, meine Frage ist, wie kann ich entweder das Fenster beginnen maximiert machen, geben Sie ihm eine Größe für, wenn es wiederhergestellt wird und machen die Größenänderung unmöglich? Oder ein Fenster erstellen, das maximiert startet und nicht wiederhergestellt werden kann?

Antwort

3

Es gibt eine einfache Lösung, die fast die ganze Zeit funktioniert: machen Sie Ihren Rahmen nicht veränderbare nach sichtbar eingestellt haben. So ändert nur den Code auf diese Weise:

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

} 

Auf diese Weise wird der Rahmen maximiert starten und die Maximieren-Schaltfläche wird abgeblendet, Benutzer verhindern, dass es zu verwenden. (Ich weiß nicht wirklich, warum Sie das tun müssen. Ich nehme an, der maximierte Zustand wird nur angewendet, wenn das Fenster sichtbar wird, und wenn Sie es vorher nicht einschränkbar machen).

Es funktioniert fast immer unter, denn unter Windows 7 können Sie das Fenster aus dem maximierten Zustand bringen, indem Sie auf die Titelleiste klicken und es ziehen. Aber es wird in der Größe sein, die Sie vorher festgelegt haben. Problem ist, dass Ihr Benutzer nicht in der Lage ist, es wieder zu maximieren, und ich habe den Weg mit Zuhörern nicht gefunden, um das Fenster wieder in den maximierten Zustand zu bringen. (Edit: @David Kroukamp zeigt im letzten Teil seiner Antwort, dass es möglich ist, den maximierten Zustand mit einem ComponentListener zu erzwingen. Deshalb müssen Sie setResizable(false) nicht verwenden. Auf diese Weise haben Sie immer noch ein Problem mit Windows 7 die schleppende Aktion wird von diesem Ereignis aus irgendeinem Grund nicht eingefangen, aber Benutzer können die maximierte Schaltfläche verwenden, um sie wieder dorthin zu bringen, wo sie sein sollte.)

gibt es fast nie einen Grund, diese Art zu tun von Sachen. Benutzer mögen es nicht wirklich, wenn sie verhindern, dass sie ihre Fenster manipulieren (maximierte Fenster können beispielsweise nicht verschoben werden, und das kann ärgerlich sein, wenn Sie mehrere Bildschirme haben). Eine Ausnahme ist, wenn Sie ein Spiel machen, das normalerweise Vollbild ist. Aber dann würdest du keinen JFrame haben wollen, weil du nicht die ganze Dekoration willst, sondern ein Fenster.

Wenn Ihr Problem ist, dass die Standardfenstergröße sehr klein ist, ist es normal. Sie müssen zuerst etwas in Ihren Rahmen einfügen (einige Steuerelemente, Schaltflächen, was Sie in Ihrer Anwendung haben wollen), Layouts verwenden (das ist wichtig) und dann die Methode pack() auf Ihrem Rahmen aufrufen. Es wird eine schöne Standardgröße für Ihr Fenster gewählt.

Schließlich, ein letztes Wort. Ich habe meinen Beispielcode in eine main Methode als eine Abkürzung gesetzt, aber Sie sollten immer Swing Sachen in der Swing EDT machen, indem Sie SwingUtils.invokeLater() verwenden.

+1

Vielen Dank! Das funktioniert. Um ehrlich zu sein, habe ich gerade erst angefangen, Swing zu verdienen, also wollte ich es wirklich tun können, anstatt es auf irgendetwas anzuwenden! Danke noch einmal! –

0

In welcher Umgebung laufen Sie? Ich habe dies mit JDK1.6/JDK1.7 unter Win7 versucht und es funktioniert wie erwartet (Fenster startet maximiert, minimiert auf Taskleiste).

+0

Ich spreche über die mittlere Taste, "wiederherstellen". Nichts zu minimieren. Führen Sie den Code ohne setResizable aus, und Sie werden sehen, wie ich es starten möchte. –

1

Manchmal müssen Sie bei der Reihenfolge, in der Sie JFrame-Parameter festlegen, vorsichtig sein.

Außerdem sollten Sie Swing-Komponenten im Ereignisversand-Thread verwenden.

Versuchen Sie dies und sehen Sie, ob es hilft.

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

Nein, das Fenster ist nicht maximiert. Es kann immer noch herumgeschleift werden und die Wiederherstellungsschaltfläche ist nicht verwendbar. Danke trotzdem. –

0

Ich habe Art von Hack für Sie die funktionieren könnte. Versuchen Sie diesen Code (es für mich gearbeitet):

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() sendet einen String zurück, die aussieht wie "COMPONENT_RESIZED (-8, -8, [Bildschirmgröße])", wenn eine Aktion wiederherstellen stattfindet.