2012-01-08 5 views
7

J'ai un JPanel ajouté à un JViewport, et le panneau a plusieurs autres panneaux ajoutés. J'essaie d'implémenter une sélection de glissement, où vous pouvez sélectionner plus d'un composant en faisant glisser la souris. Le seul problème auquel je suis confronté est que le rectangle de sélection est en train d'être peint derrière les composants ajoutés au JPanel principal. Comment puis-je peindre au-dessus d'eux?Peinture sur le dessus des composants dans Swing?

Ma structure est la suivante:
JFrame ->ContentPane ->JLayeredPane ->JScrollPane ->JPanel ->JPanel [].

projet de conception pour l'attribution des collèges:
Comme vous pouvez le voir, le rectangle est derrière les autres panneaux.

Design draft for college assignment.

+2

+1: Ça a l'air très bien! Quel OS fonctionne-t-il? Ou quel aspect et sens est utilisé? La police ressemble à "Ubuntu". –

+0

En ce moment sur Windows, mais quand j'ai fini, ça va ressembler à Windows et Mac. J'ai créé tous les composants à partir de zéro, ce qui est probablement un moyen naïf de s'y prendre, mais j'aime la liberté de conception qu'il permet. – rtheunissen

+0

Police est Gotham, mais je ne suis pas sûr si je vais y rester. : p – rtheunissen

Répondre

8

C'est ce que je fais déjà (sur un niveau évidemment beaucoup plus simple) et swing peint le rectangle sous les composants ajoutés.

Ceci est un cas où vous devez remplacer la méthode paint() du panneau et non la méthode paintComponent(). Ensuite, la peinture personnalisée sera faite APRÈS que tous les composants de l'enfant ont été peints.

+0

qui me font sentir +1 – mKorbel

+0

Je n'ai même pas vu cette réponse, je vais essayer. Merci – rtheunissen

+0

Désolé d'avoir pris autant de temps pour faire un rapport. – rtheunissen

1

Sans voir votre code actuel, il est difficile de dire ce que vous faites mal. Cependant, je peux encore dire ce que je ferais:

Créer un JPanel qui représente la zone entière où vous voulez dessiner, qui - bien sûr - contient tous les composants.
Override ce panneau son paintComponents(Graphics) comme celui-ci (Edited, notez le s est maintenant le dernier caractère du nom de la méthode):

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

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

C'est ce que je fais déjà (à un niveau beaucoup plus simple évidemment), et Swing peint le rectangle sous les composants qui y sont ajoutés. – rtheunissen

+0

Hmm, alors essayez de remplacer paintComponents à la place. –

+0

Cela a-t-il fonctionné en utilisant paintComponents? –

4

Utilisez un volet en couches:

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

Cela vous permet pour créer des composants qui se chevauchent.

Utilisez une vitre pour gérer la peinture de glisser, et peut-être des événements ainsi:

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

+0

Ok, donc ma structure est la suivante: JFrame -> ContentPane -> LayeredPane -> JScrollPane -> JPanel -> JPanel []. J'ai ajouté une capture d'écran à la question. – rtheunissen

+0

Vous devrez placer le LayeredPane dans le JScrollPane pour pouvoir faire défiler l'overlay (si vous le souhaitez). –

+0

Je pense que je vois ce que tu veux dire. Par exemple: 'JFrame' ->' ContentPane' -> 'JLayeredPane' ->' JScrollPane' -> ** JLayeredPane ** -> 'JPanel' ->' JPanel [] ' – rtheunissen

1

chaud vraiment sûr de ce que vous effet vraiment besoin et dernier, est peut-être il y a deux autres façons peinture à

1) GlassPane

2) Viewport

vous ca n mis ensemble que, ATTENTIVEMENT Insets au visible Rectanle

0

Bon, ce que j'ai décidé de le faire à la fin:
Je ne suis pas sûr que ce soit la meilleure façon de le faire, mais il semble pour travailler d'accord.
Remarque: Utilisation de MigLayout.

Dans le constructeur du JPanel se trouvant sous les blocs colorés.

... 
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

Voir aussi [opacité] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props). – trashgod

0

La peinture personnalisée au-dessus des composants Swing est facilitée par JLayeredPane. T his article décrit une classe de base abstraite qui facilite la surpeinture de zones spécifiques (comme les rectangles de sélection ou les limites de composants).