2013-03-15 12 views
5

Nella mia app, mostro una finestra di dialogo popup per mostrare un grande elenco di carte. Li visualizzo come immagini in molti componenti JLabel in una sottoclasse JPanel. Ho quindi messo quell'oggetto in un JScrollPane per consentire lo scorrimento orizzontale attraverso le carte.JScrollPane con sfondo trasparente e contenuto

Voglio lo spazio inutilizzato per essere trasparente con uno sfondo scuro per mostrare che ciò che è dietro è disabilitato. Ho usato setBackground(new Color(50, 50, 50, 200)) per ottenere l'aspetto che desidero, ma il contenuto dietro di esso non viene ridisegnato, quindi divento artefatto.

Ecco come si presenta:

Artifacting when scrolling

Come potrei fare per correggere questo? Come posso ridisegnare il contenuto dietro di esso quando si scorre?

Grazie in anticipo.

risposta

6

Estrarre la finestra dall'equazione per il momento.

Il JScrollPane contiene uno JViewport che quindi contiene il contenuto. Quindi è necessario impostare il riquadro del contenuto su trasparente, il riquadro della vista su trasparente e quindi il riquadro di scorrimento su trasparente.

È possibile ottenere questo utilizzando setOpaque(false) su ciascuno di questi contenitori.

Ciò garantisce che il gestore del ridisegno ora dipinga attraverso lo sfondo.

Il problema successivo è che Swing non supporta effettivamente componenti "semi-trasparenti" (ovvero, è opaco o trasparente).

è possibile implementare questa l'override del metodo del componente principale paintComponent (quello sulla viewport è probabilmente sufficiente)

+0

Buona chiamata sul 'JViewport'. Non sapevo che esistesse. Ho usato una combinazione di entrambe le risposte per risolverlo. – MaxGhost

1

provare il seguente ... potrebbe dare qualche sollievo durante lo scorrimento. È probabile che si verifichi un problema anche quando il frame principale viene ingrandito o ripristinato. Avrai bisogno di un ascoltatore per quegli eventi e una correzione simile a .

jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
+0

Grazie. Ho usato una combinazione di entrambe le risposte per risolverlo. – MaxGhost