2012-01-08 9 views
7

Ho un JPanel aggiunto a un JViewport e al pannello sono aggiunti altri pannelli. Sto cercando di implementare una selezione di trascinamento, in cui è possibile selezionare più di un componente trascinando il mouse. L'unico problema che sto affrontando è che il rettangolo di selezione viene dipinto dietro i componenti aggiunti al principale JPanel. Come posso dipingere sopra di loro?Dipinto sopra i componenti in Swing?

La mia struttura è la seguente:
JFrame ->ContentPane ->JLayeredPane ->JScrollPane ->JPanel ->JPanel [].

design progetto per l'assegnazione del college:
Come si può vedere, il rettangolo è dietro gli altri pannelli.

Design draft for college assignment.

+2

+1: sembra molto bello! Su quale sistema operativo è in esecuzione? O che aspetto viene utilizzato? Il carattere sembra "Ubuntu". –

+0

Al momento su Windows, ma quando ho finito sembrerà lo stesso su Windows e Mac. Ho creato tutti i componenti da zero, che è probabilmente un modo ingenuo per farlo, ma mi piace la libertà di progettazione che consente. – rtheunissen

+0

Font è Gotham, ma non sono sicuro che mi terrò. : p – rtheunissen

risposta

8

Questo è quello che sto già facendo (ad un livello molto più semplice, ovviamente), e swing dipinge il rettangolo sotto i componenti aggiunti ad esso.

Questo è un caso in cui è necessario eseguire l'override del metodo paint() del pannello e non del metodo paintComponent(). Quindi la verniciatura personalizzata verrà eseguita DOPO che tutti i componenti del bambino sono stati verniciati.

+0

che mi fanno sentire +1 – mKorbel

+0

Non ho nemmeno visto questa risposta, ci provo. Grazie – rtheunissen

+0

Ci scusiamo per aver impiegato così tanto tempo a riferire. – rtheunissen

1

Senza vedere il codice vero e proprio, è difficile dire che cosa si sta facendo male. Tuttavia, posso ancora dire cosa farei:

Creare un JPanel che rappresenta l'intera area in cui si desidera disegnare, che - ovviamente - contiene ogni componente.
Override quel pannello sua paintComponents(Graphics) come questo (a cura, notare il s è ora l'ultimo carattere dal nome del metodo):

@Override 
public void paintComponents(Graphics g) 
{ //     ^
    super.paintComponents(g); 

    // Draw your selection rectangle: 
    g.setColor(Color.RED); 
    g.drawRectangle(selectionRectangle); 
} 
+0

Questo è quello che sto già facendo (ovviamente su un livello molto più semplice), e Swing dipinge il rettangolo sotto i componenti aggiunti ad esso. – rtheunissen

+0

Hmm, quindi provare a ignorare paintComponents. –

+0

Funzionava, usando paintComponents? –

4

Utilizzare un riquadro a strati:

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

Ciò consente per creare componenti sovrapposti.

Utilizzare una lastra di vetro per gestire la pittura di trascinamento, e, eventualmente, gli eventi così:

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

+0

Ok, quindi la mia struttura è la seguente: JFrame -> ContentPane -> LayeredPane -> JScrollPane -> JPanel -> JPanel []. Ho aggiunto uno screenshot alla domanda. – rtheunissen

+0

Dovrai posizionare LayeredPane all'interno di JScrollPane per poter scorrere la sovrapposizione (se lo desideri). –

+0

Penso di vedere cosa intendi. Ad esempio: 'JFrame' ->' ContentPane' -> 'JLayeredPane' ->' JScrollPane' -> ** JLayeredPane ** -> 'JPanel' ->' JPanel [] ' – rtheunissen

1

caldo davvero sicuro di quello che non si ha realmente bisogno e l'effetto finale, forse è lì due altri modi pittura alla

1) GlassPane

2) Viewport

si ca n messo che, insieme, carrefully Insets al visibile Rectanle

0

Okay, questo è quello che ho deciso di fare alla fine:
Non sono sicuro se questo è il modo migliore per farlo, ma sembra lavorare bene.
Nota: utilizzo di MigLayout.

Nel costruttore dello JPanel che si trova sotto i blocchi colorati.

... 
this.add(new JPanel() { 

    @Override 
    public boolean isOpaque() { 
     return false; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     if (dragShape != null) { 
      g.setColor(Colors.SECONDARY); 
      g.setStroke(new BasicStroke(2)); 
      g.draw(dragShape); 
     } 
    } 
    }, "pos 0 0, width 100%, height 100%", 0); 
    ... 
+0

Vedere anche [opacità] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props). – trashgod

0

La verniciatura personalizzata su componenti Swing è facilitata da JLayeredPane. T his article descrive una classe base astratta che facilita la sovrapposizione di aree specifiche (come rettangoli di selezione o limiti di componenti).

Problemi correlati