2012-08-13 11 views
5

Kod:setPreferredSize nie działa

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 

Tak ustawić preferowany rozmiar JPanel do 600 przez 600 i zapakować ramkę, ale rozmiar ramy jest nadal 0 przez 0.

Dlaczego to i jak mogę to naprawić?

+2

See [? Dlaczego jest mile widziana w użyciu null układ w Swing] (http://stackoverflow.com/questions/6592468/why-is- to jest niezadowolone z użycia-a-null-layout-in-swing) –

Odpowiedz

8

Jak powiedział pack() spróbuje zorganizować okno tak, że każdy składnik jest zmieniany na jego preferredSize.

Problem polega na tym, że wygląda na to, że menedżer układu stara się rozmieścić komponenty i ich odpowiednie preferowane rozmiary. Jednak po ustawieniu menedżera układu na wartość null, nie ma nikogo odpowiedzialnego za to.

Spróbuj skomentować linię setLayout(null), a zobaczysz wynik. Oczywiście, dla pełnego okna, będziesz musiał wybrać i ustawić znaczący LayoutManager.

Działa to dobrze dla mnie:

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     //setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 
+0

ah, to działa, dzięki :) – Doorknob

2

pack() odpytuje preferowany rozmiar kontenera nadrzędnego nad że od dziecka więc trzeba by użyć:

setPreferredSize(new Dimension(600, 600)); 

Inna uwaga jest wywołanie

setLocationRelativeTo(null); 

po pack() został wezwany do obliczyć współrzędne środkowe :)

OK, właśnie zauważyłem tam układ zerowy, czemu nie użyć domyślnej ramki BorderLayout z JFrame?

+0

ok, dzięki, że działa, ale teraz cokolwiek dodam do JPanel się nie pojawi! – Doorknob

+0

Zobacz moją aktualizację powyżej – Reimeus

+1

+1 za pytanie o zmianę sekwencji, w której wykonywane są połączenia. Najpierw dodaj komponenty do 'JFrame', aby rozmiar mógł zostać zrealizowany, a następnie poprowadź jego pozycję na ekranie względem rozmiaru, a następnie ustaw go jako widoczny. dobre podejście :-) –

2

Twój problem jest setLayout(null), becase docs powiedzieć pack():

Powoduje to okno, aby mieć takie wymiary, aby pasowały preferowany rozmiar i układy podskładniki

więc bez układu to robi nie wykonać poprawnie.

To wydaje się działać dobrze dla mnie:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame { 

    JPanel panel = new JPanel(); 

    private void createAndShowGUI() { 
     setTitle("FrameDemo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     panel.setPreferredSize(new Dimension(600, 600)); 
     add(panel); 

     //setLayout(null); //wont work with this call as pack() resizes according to layout manager 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Game().createAndShowGUI(); 
      } 
     }); 
    } 
}