2012-09-21 13 views
6

Jeśli utworzę ramki JFrame bez możliwości zmiany, a okno Aero zostanie włączone, setLocation nie będzie poprawnie uwzględniać obramowania okna.Bez możliwości zmiany rozmiaru obramowania okna i pozycjonowania

W poniższym kodzie spodziewałbym się, że druga ramka zostanie umieszczona po prawej stronie pierwszej ramki, zamiast tego brzegi zachodzą na siebie. Jeśli Aero jest wyłączone lub jeśli usunę połączenia do setResizable, robi się to zgodnie z oczekiwaniami.

import java.awt.Rectangle; 
import javax.swing.JFrame; 
public class FrameBorders { 
public static void main(String[] args) { 
    JFrame frame1 = new JFrame("frame 1"); 
    JFrame frame2 = new JFrame("frame 2"); 

    frame1.setResizable(false); 
    frame2.setResizable(false); 

    frame1.setVisible(true);   
    Rectangle bounds = frame1.getBounds();  
    frame2.setLocation(bounds.x+bounds.width, bounds.y); 
    frame2.setVisible(true); 

} 
} 

Czy robię coś nie tak, czy to błąd? Jak wyświetlić 2 nieukierunkowane okna dialogowe obok siebie bez nakładania się granic?

Edit: dodano zdjęcia (zmieniane również frame2 do JDialog zamiast JFrame)

Aero On: Aero On

Aero Off: Aero Off

Aero włączone, ale resizable: Aero On but resizable

+0

Dlaczego chcesz wyświetlić 2 unresizable dialogi obok siebie bez granic nakładających? –

+0

Chcę wyświetlić 2 okna, które są początkowo ustawione obok siebie. – msam

+2

Nie należy ustawiać dowolnych granic w pojemniku bez możliwości zmiany rozmiaru. Zobacz [* Korzystanie z wielu JFrames, Good/Bad Practice *] (http://stackoverflow.com/a/9554657/230513)? – trashgod

Odpowiedz

7

Jakie są problemy z se ma ograniczenia na pojemnikach bez możliwości zmiany rozmiaru?

Załóżmy, że dopasowujesz granice, aby dobrze wyglądać na platformie. Załóżmy, że platforma użytkownika ma czcionkę o innym, powiedzmy większym, FontMetrics. Ten przykład jest nieco wymyślny, ale masz pomysł. Jeśli zmienisz zakres kontenera bez możliwości zmiany rozmiaru, upewnij się, że dowolny tekst jest widoczny niezależnie od domyślnej czcionki platformy hosta.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

/** 
* @see http://stackoverflow.com/a/12532237/230513 
*/ 
public class Evil extends JPanel { 

    private static final String s = 
     "Tomorrow's winning lottery numbers: 42, "; 
    private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); 

    public Evil() { 
     this.add(label); 
    } 

    private void display() { 
     JFrame f = new JFrame("Evil"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this, BorderLayout.WEST); 
     f.pack(); 
     int w = SwingUtilities.computeStringWidth(
      label.getFontMetrics(label.getFont()), s); 
     int h = f.getHeight(); 
     f.setSize(w, h); 
     f.setResizable(false); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new Evil().display(); 
      } 
     }); 
    } 
} 
+1

Mogłeś być bogaty! – trashgod

+0

Jest to dobry punkt, jeśli chodzi o zmianę rozmiaru (i byłaby to dobra odpowiedź na pytanie, które zrobiłem w komentarzach, jeśli została podjęta samodzielnie), jednak moim pierwotnym problemem jest pozycjonowanie. Załóżmy, że użycie pack()/no text/size nie zmieni się, a nawet pustych okien dialogowych/ramek, jak w moim własnym przykładzie. – msam

+1

Wypróbuj 'pack()', które "powoduje, że to' okno' ma rozmiar dopasowany do preferowanego rozmiaru i układów jego podkomponentów. " Przepraszam, nie używam aero; [sscce] (http://sscce.org/), który pokazuje problem, który opisujesz, może być pomocny. – trashgod

5

Wydaje się, że to nie jest problem, ale raczej Java aero AppCompat problem, jak opisano here.

Jednym z rozwiązań, które widzę w Javie to niech będzie zmienny rozmiar okna potem obejść setMaximumSize bug

+0

+1 good find ... –

+0

Dobry link; platforma posiada dekoracje ramek, więc wynik nie jest całkowicie obleśny; 'aqua' ma swój udział w podobnych anomaliach. – trashgod

Powiązane problemy