2013-11-23 18 views
7

Ich habe derzeit die DropShadowBorder Klasse (die die javax.swing.border.Border Klasse erweitert) aus der SwingX Bibliothek, so ist dies eine Instanz eines regulären Border. Ich möchte diesen Rand um meine undekorierte JFrame zeichnen. Ich bin derzeit mit der folgenden Methode in meinen JFrame die Grenze zu setzen:Java: Wie zeichne ich einen Rahmen um einen undekorierten JFrame?

DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true); 
this.getRootPane().setBorder(b); 

Anmerkung: Ich bin mit dem Wurzelbereich des Rahmens an die Grenze zu ziehen, weil die Rahmengrenzen nicht unterstützt selbst.

Das Problem ist, dass die Grenzen im Innern des Bauteils gezogen werden selbst, wie man auf dem Bild unten sehen kann, ist die beschattete Grenze innen gezogen, gegen die Grenzen des Rahmens selbst:

enter image description here

Hinweis: Der (schattierte) Rahmen wird innerhalb des Rahmens gegen dessen Begrenzungen statt außerhalb des Rahmens gezeichnet.

Es spielt keine Rolle, welche Art von Grenze verwendet wird, alle sind innerhalb der JFrame selbst gezeichnet.

Meine Frage ist: Ist es möglich, einen Rahmen um den Rahmen zu zeichnen, nicht nur innerhalb der Grenzen des Rahmens?


Eine Möglichkeit, die verwendet werden könnte, dieses Problem zu lösen, ist ein anderes undecorated Vollbild-Fenster zu schaffen, die transparent ist, das normale Fenster oben auf diese gesetzt wird. Dieses Vollbildfenster wird zum Zeichnen des Schattens verwendet, sodass der Schatten nicht im Bild selbst gezeichnet werden muss. Dies ist eine Lösung, um ein ähnliches Ergebnis zu erhalten, das ist nicht was ich möchte aber. Ich möchte einen Rahmen außerhalb des Rahmens zeichnen. Diese Art von Lösungen verursacht normalerweise andere Probleme.

+1

'this.getContentPane() setBorder (b);', aber besser ist es setzen 'JPanel' mit' Borders' – mKorbel

+0

'Ist Es ist möglich, irgendeinen Rahmen um den Rahmen selbst herum zu zeichnen, nicht um den Hauptbereich des Rahmens? '- Nein. Welches Problem versuchen Sie zu lösen? – camickr

+0

Ich möchte meinem nicht dekorierten 'JFrame' einen Schatten hinzufügen. Ich habe derzeit eine Grenze, die den Schatten erstellt, wie Sie auf dem Bild in meiner Frage sehen können. Das Problem besteht darin, dass diese Grenzen innerhalb der Komponente gezeichnet werden, auf die der Rahmen festgelegt wurde. Auf diesem Bild wird beispielsweise der Rahmen innerhalb der Grenzen des Rahmens gezeichnet. Gibt es eine Möglichkeit, diese Schattengrenze auf die Außenseite des Rahmens zu zeichnen? Hinweis: Ich habe die Frage aktualisiert, um alles ein wenig klarer zu machen. –

Antwort

0

Von http://nadeausoftware.com/articles/2009/02/windows_java_tip_how_control_window_decorations

einige Java-Look und fühlt, kann ihre eigene Titelleiste, Icons und Fensterrahmen bereitzustellen. Wenn ein Look & Feel diese Funktion unterstützt, gibt die Methode getSupportsWindowDecorations() true zurück.

Sie müssen also Ihr eigenes Java Look & Feel implementieren.

+0

Netter Artikel, sehr nützlich, aber das zeigt mir nicht, wie man einen Schatten oder irgendeinen anderen zeichnet andere Grenze um einen 'JFrame'. –

1

JFrames und JDialogs sind die einzigen (Swing-) Fenster, die mit dem externen Windowing-System interagieren müssen. Um externe Schatten zu erhalten, benötigen Sie einen externen Kontext. Sehen Sie diese Antwort, wie es zu bekommen:

Undecorated JFrame shadow

+0

Ist es erforderlich, Serval-Layer zu verwenden? In diesem Beispiel wird ein neuer Inhaltsbereich erstellt, in den alle Bildinhalte eingefügt werden. Der Schatten wird auf dem Bild selbst gezeichnet. Ist es erforderlich, diese Methode zu verwenden, besteht das Problem darin, dass dies Probleme bei der Fensterausrichtung und Vollbildproblemen verursachen kann. –

13

Ja Sie die Ränder um das undecorated JFrame ziehen. Holen Sie einfach den Root-Bereich des JFrame und legen Sie seine Grenzen durch setBorder (Border border) -Methode.

getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED)); 

. Zum Beispiel:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Borders2UndecoFrame extends JFrame{ 
    JLabel label = new JLabel("Welcome!", JLabel.CENTER); 
    public Borders2UndecoFrame(){ 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(new Dimension(200, 200)); 
     add(label, BorderLayout.CENTER); 
     setUndecorated(true); 
     getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED)); 
     setVisible(true); 

    } 
    public static void main(String[] args) { 
     new Borders2UndecoFrame(); 
    } 

} 

enter image description here

+0

So weit ich weiß, schrumpft dies nur den Wurzelbereich, so dass es den Rahmen innerhalb des Rahmens selbst zeichnen kann. Dies mag für einige Situationen perfekt sein, aber für Schatten scheint es nicht sehr gut zu funktionieren. Schau dir das Bild an, das ich in die Frage gestellt habe. Dieses Beispiel zeigt, worüber ich rede. Danke für die Antwort und das Codebeispiel! –

+0

Ja, es wird den rootPane verkleinern, aber die Größe des Rahmens durch Hinzufügen der Größe der Grenze erhöhen. Außerdem geht es bei Ihrer Frage nicht um Schatten, sondern um Grenzen. Danke –

+0

Ich muss sagen, dass Sie Recht haben. Ich habe in meiner Frage bemerkt, dass ich den Rahmen um den Rahmen herum zeichnen möchte, aber diese Antwort zieht es um den Wurzelbereich, aber immer noch innerhalb des Rahmens. Das löst also nicht wirklich das Problem, fürchte ich. –

Verwandte Themen