2013-11-23 17 views
7

Attualmente ho la classe DropShadowBorder (che estende la classe javax.swing.border.Border) dalla libreria SwingX, quindi questa è un'istanza di un normale Border. Vorrei disegnare questo bordo attorno al mio JFrame non decorato. Attualmente sto usando il seguente metodo all'interno del mio JFrame per impostare il confine:Java: come disegnare un bordo attorno a un JFrame non decorato?

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

Nota: sto usando il pannello principale del telaio per disegnare il confine, perché il telaio non supporta le frontiere si.

Il problema è che i confini sono disegnati all'interno del componente stesso, come si può vedere nella figura in basso, il bordo in ombra viene disegnato all'interno, contro i limiti del telaio stesso:

enter image description here

Nota: il bordo (ombreggiato) viene disegnato all'interno della cornice rispetto ai suoi limiti, anziché all'esterno della cornice.

Non importa quale tipo di bordo viene utilizzato, tutti sono disegnati all'interno dello stesso JFrame.

La mia domanda è: È possibile disegnare qualsiasi bordo attorno al fotogramma, non solo all'interno contro i limiti del fotogramma?


Un modo che potrebbe essere utilizzato per risolvere questo problema, è quello di creare una diversa non decorato finestra in pieno schermo che è trasparente, la finestra normale viene messo in cima a questa. Questa finestra a tutto schermo viene utilizzata per disegnare l'ombra, quindi l'ombra non deve essere disegnata nel frame stesso. Questa è una soluzione per ottenere un risultato simile, questo è non quello che vorrei però. Voglio disegnare un bordo al di fuori della cornice. Questo tipo di soluzioni di solito causa altri problemi.

+1

'this.getContentPane() setBorder (b);', ma migliore è lì messo 'JPanel' con' 'E 'Borders' – mKorbel

+0

è possibile disegnare qualsiasi bordo attorno al frame stesso, no attorno al riquadro radice del frame? '- No. Che problema stai tentando di risolvere? – camickr

+0

Vorrei aggiungere un'ombra al mio 'JFrame' non decorato. Al momento ho un bordo che crea l'ombra come puoi vedere nella foto nella mia domanda. Il problema è con questi bordi che è disegnato all'interno del componente su cui è stato impostato il bordo. Su quell'immagine, ad esempio, il bordo viene disegnato all'interno dei limiti della cornice. C'è un modo per disegnare questo bordo ombra all'esterno della cornice? Nota: ho aggiornato la domanda per rendere tutto un po 'più chiaro. –

risposta

0

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

Alcuni cercano di Java e si sente in grado di fornire la propria barra del titolo, icone, e la finestra di confine. Se un aspetto grafico supporta questa funzione, il metodo getSupportsWindowDecorations() restituirà true.

Quindi è necessario implementare il proprio Java Look & Feel.

+0

Bel articolo, molto utile, ma questo non mi mostra come disegnare un'ombra, o qualsiasi altro bordo attorno a 'JFrame'. –

1

JFrames e JDialogs sono le uniche finestre (oscillanti) che devono interagire con il sistema di finestre esterne. Per ottenere le ombre esterne, è necessario il contesto esterno. Vedere questa risposta su come ottenerlo:

Undecorated JFrame shadow

+0

È necessario utilizzare i livelli serval? In questo esempio, viene creato un nuovo riquadro del contenuto in cui inserire tutti i contenuti della cornice. L'ombra viene disegnata sul frame stesso. È necessario utilizzare questo metodo, il problema è che questo potrebbe causare problemi di allineamento della finestra e schermo intero molto facilmente. –

13

Sì, è possibile disegnare i bordi intorno al JFrame non decorato. Basta semplicemente ottenere il pannello radice di JFrame e impostarne i bordi mediante il metodo setBorder (bordo bordo).

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

Ad esempio:.

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

Per quanto ne so, questo restringerà solo il riquadro radice in modo che possa disegnare il bordo all'interno del frame stesso. Questo potrebbe essere perfetto per alcune situazioni, ma per le ombre, d'altra parte, non sembra funzionare molto bene. Guarda l'immagine che ho inserito nella domanda, questo esempio mostra di cosa sto parlando. Grazie per la risposta e il codice di esempio comunque! –

+0

Sì, davvero ridurrà il rootPane ma aumenterà le dimensioni del frame aggiungendo la dimensione del bordo. Inoltre la tua domanda non riguarda l'ombra ma riguarda i confini. Grazie –

+0

Devo dire che hai ragione su questo. Nella mia domanda ho notato che mi piacerebbe disegnare il bordo attorno al fotogramma, ma questa risposta disegna il bordo attorno al riquadro della radice ma ancora all'interno della cornice. Quindi questo non risolve il problema temo. –