2012-06-27 10 views
15

Mam dziwny problem. Używam pustego układu dla okna (= JFrame i na windows) i jeśli używam setResizable (false), rozmiar okna staje się większy (na prawo i na dole, powiedziałbym około 10 pikseli). Nie wiem dlaczego.Java setResizable (false) zmienia rozmiar okna (swing)

Dwa println na powrót tych samych rozmiarów, co jest dziwne, również ...

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
mainWnd.setTitle(wndTitle); 
mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 
mainWnd.setResizable(false); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 

Czy ktoś ma pomysł? Dlaczego okno zmienia rozmiar?

UPDATE: samo tutaj (skompilować go i bez setResizable i nie można go zobaczyć, jeśli pokrywają okna):

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Main 
{ 
    private static JFrame mainWnd = null; 

    public static void main(String[] args) 
    { 
     mainWnd = new JFrame(); 

     mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWnd.setTitle("asda"); 
     mainWnd.setBounds(50, 50, 300, 300); 

     mainWnd.setResizable(false); 

     mainWnd.setVisible(true); 
    } 
} 
+0

Dostaniesz lepszą i szybszą odpowiedź, jeśli wykazują [SSCCE] (http://sscce.org). – assylias

+0

jest przykład, nie mogę wkleić reszty, bo działa za nią xml-parser i wiele więcej ... a problem właśnie się dzieje z wywołaniem setResizable – immerhart

+0

Nie mogę odtworzyć tego zachowania. Więc spróbuj pozbyć się wszystkich niepotrzebnych części i opublikuj kompilowany i działający przykład, który ma wspomniane zachowanie. – assylias

Odpowiedz

13

Nie zmienia to na moim przykładzie, więc musisz mieć coś innego, co powoduje problem:

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Test4 { 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setBounds(0, 0, 300, 200); 
     frame.setVisible(true); 
     System.err.println(frame.getSize()); 
     frame.setResizable(false); 
     System.err.println(frame.getSize()); 
    } 

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

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 

EDIT/UPDATE:

Jakoś wypustki są niepoprawne po ustawieniu skalowalny false (przynajmniej w systemie Windows 7 i JDK 6). W jakiś sposób zmieniają się z 30,8,8,8 do 25,3,3,3, chociaż granica (która jest namalowana przez system operacyjny) pozostaje w rzeczywistości taka sama. Ponieważ wstawki są częścią granic ramki, ramka jest w rzeczywistości za duża (wizualnie), gdy nie można jej zmienić. Dla mnie wygląda na to, że w wyliczonych wstawkach jest błąd, gdy nie można zmienić rozmiaru ramki.

+0

To samo tutaj ...... – assylias

+1

Myślę, że powinieneś uruchomić oba okna, a zobaczysz, że rozmiar nie jest większy! – immerhart

+1

W jakiś sposób wstawki są niepoprawne po ustawieniu opcji skalowania na wartość false (przynajmniej w systemie Windows 7 i JDK 6). W jakiś sposób zmieniają się z 30,8,8,8 do 25,3,3,3, chociaż granica pozostaje właściwie taka sama. Ponieważ wstawki są częścią granic ramki, ramka jest w rzeczywistości za duża (wizualnie), gdy nie można jej zmienić. Dla mnie wygląda na to, że w wyliczonych wstawkach jest błąd, gdy nie można zmienić rozmiaru ramki. –

1

W zależności od ustawienia L (zmienna) (false/true) może zmienić dekoracje obramowania okna. Brak maksymalizacji, brak strzałki zmiany rozmiaru. To samo może zmienić rozmiar.

+0

W moim przypadku, bez innych zestawów L & F, np. z domyślnym wyglądem i stylem, zmienia również rozmiar okna. – FaithReaper

1

Wymienić:

frame.setResizable(false); 

do:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      frame.setResizable(false); 
     } 
    }); 
+0

Problem występuje nadal. To nie jest rozwiązanie. – FaithReaper

4

Jeśli ustawisz setResizable false przed ustalania granic, nie będzie miał problemu. jak powiedział wcześniej Gergely Szilagyi, pozbywasz się pasków przewijania, ale rozmiar okna jest zablokowany i dlatego kończysz z 9 lub 10 pikselami dodatkowej przestrzeni w ramce. Po prostu miałem ten sam problem. dzięki za pomoc.

+0

Nie, nadal daje mi różnicę między dwoma JFrames. – FaithReaper

0

Jak dotąd najlepsza łatka dla tego irytującego problemu jest następująca. Nie ma znaczenia, gdzie nazywasz metodę setResizable(false). Po prostu dodaj ten fragment kodu po setVisible(true).

private void sizeBugPatch() { 
    while (frame.getWidth() > yourWidth) { 
     frame.pack(); 
    } 
} 

Gdzie yourWidth jest szerokość masz ustawione w każdy z możliwych sposobów, ręcznie lub nadrzędnymi setPreferredSize metod. Wyjaśnienie jest dość łatwe, jakoś wygląda na to, że frame.pack() resetuje się na frame.setResizable(boolean b). Możesz użyć pętli if zamiast pętli while, ale wolę while, aby wykluczyć, że okno będzie jeszcze większe, nawet po drugim pack().

0

Mam zdefiniowane 2 podklasy JFrame. Jeśli uruchomię ramkę problemu w samodzielnej aplikacji, rozmiar ramki jest poprawny. Jeśli uruchomię obie ramki w samodzielnej aplikacji, ramka problemu będzie nadal większa. Zrobiłem setResizable (false) przed pakietem i nadal mam problem.Moje obejście polegało na zmianie układu na BorderLayout i przesunięciu panelu (obrazu) w środku, a następnie ustawieniu setResizable.

1

Dobrze poznałem ten problem i jest to Look & Poczuj problem ...

Dlaczego zmienny rozmiar ramki ma takie wypustki z (5, 5, 5, 5)? Prowadzi mnie to do myślenia, że ​​powoduje, że można go skalować, dodając do niego dodatkowy komponent, na przykład ... jakiś "uchwyt" do przeciągnięcia, aby zmienić rozmiar?

A następnie stwierdziłem, że jeśli użyjemy domyślnego Java Metal l & f i ustawimy setDefaultLookAndFeelDecorated(true), program obsługi zostanie pomalowany, a więc ramka nie zmieni rozmiaru. Ale w Nimbus, Motif i Windows L & F ten punkt nie jest zaimplementowany, więc jest to błąd. Zgłoszę to.

moje własne pytanie i moja odpowiedź z GIF jest tutaj:

Swing - setResizable(true) make JFrame title bar higher and window size smaller