2012-09-21 7 views
6

Wenn ich nicht veränderbare JFrames erstellen und Windows Aero aktiviert ist, scheint setLocation den Fensterrahmen nicht korrekt zu berücksichtigen.nicht resizierbare Fensterrahmen und Positionierung

Im folgenden Code würde ich erwarten, dass der zweite Frame rechts vom ersten Frame positioniert wird, stattdessen die Grenzen überlappen. Wenn Aero deaktiviert ist oder wenn ich die Anrufe zu setResizable entferne, wird dies wie erwartet ausgeführt.

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

} 
} 

Mache ich etwas falsch oder ist das ein Fehler? Wie kann ich 2 nicht veränderbare Dialoge nebeneinander anzeigen, ohne überlappende Ränder zu haben?

Edit: hat Screenshots (geändert auch frame2 zu einem JDialog anstelle eines JFrame)

Aero On: Aero On

Aero Off: Aero Off

Aero On aber veränderbare: Aero On but resizable

+0

arbeiten zu lassen Warum wollen Sie ohne überlappende Grenzen unresizable 2 Dialoge nebeneinander angezeigt werden soll? –

+0

Ich möchte 2 Fenster anzeigen, die anfangs nebeneinander positioniert sind. – msam

+2

Bitte setzen Sie keine willkürlichen Grenzen auf einen nicht veränderbaren Container. Siehe [* Die Verwendung mehrerer JFrames, gute/schlechte Praxis *] (http://stackoverflow.com/a/9554657/230513)? – trashgod

Antwort

7

Was sind die Probleme mit se Ttings Grenzen auf nicht veränderbare Container?

Angenommen, Sie passen die Grenzen so an, dass sie auf Ihrer Plattform gut aussehen. Angenommen, die Plattform des Benutzers hat eine Schriftart mit anderen, sagen wir größer, FontMetrics. Dieses Beispiel ist etwas erfunden, aber Sie bekommen die Idee. Wenn Sie die Grenzen eines nicht veränderbaren Containers ändern, müssen Sie sicherstellen, dass jeder Text unabhängig von der Standardschriftart der Hostplattform sichtbar ist.

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

Sie hätten reichen können! – trashgod

+0

Das ist ein guter Punkt, was die Größenanpassung betrifft (und wäre eine gute Antwort auf die Frage, die ich in den Kommentaren gemacht habe, wenn sie für sich genommen ist), aber mein ursprüngliches Problem ist die Positionierung. Angenommen, die Verwendung von pack()/no text/size wird nicht geändert oder sogar leere Dialoge/Frames wie in meinem eigenen erfundenen Beispiel. – msam

+1

Probieren Sie 'pack()', was "bewirkt, dass dieses' Fenster' an die bevorzugte Größe und das Layout seiner Unterkomponenten angepasst wird. " Tut mir leid, ich benutze kein Aero; Ein [sscce] (http://sscce.org/), der das von Ihnen beschriebene Problem aufweist, kann hilfreich sein. – trashgod

5

Es scheint, dass dies kein Java Problem ist, sondern eine aero appcompat Frage, wie here beschrieben.

Eine Lösung, die ich in Java zu sehen ist die Fenster der Größe veränderbar sein dann um die setMaximumSize bug

+0

+1 gute finden ... –

+0

Gute Verbindung; die Plattform besitzt die Rahmendekorationen, so ist das Ergebnis nicht _completely_ unverschämt; 'aqua' hat seinen Anteil an ähnlichen Anomalien. – trashgod

Verwandte Themen