2010-01-13 14 views
0

J'ai un canevas AWT (bibliothèque tierce) qui affiche certaines informations. Je dois afficher un panneau de défilement au-dessus. Comme le canevas est AWT, j'ai besoin d'utiliser un ScrollPane au lieu d'un JScrollPane. Je voudrais donner une bordure arrondie au scrollpane - est-ce possible dans AWT? Ou est-il possible d'utiliser un JScrollPane en haut de la toile et de l'afficher (je pense que la dernière version de Java supporte mieux le mélange des composants légers/lourds, mais supposons que ce n'est pas une option).Personnalisation AWT ScrollPane

Merci, Jeff

+0

Vous avez mentionné popups dans un de vos commentaires - pouvez-vous donner plus de détails? PopupMenu? JPopupMenu? Popup/PopupFactory? – Nate

+0

Dans mon application, vous pouvez cliquer sur les éléments d'un affichage. Lorsque l'utilisateur clique sur l'élément, des informations le concernant apparaissent. Il peut y avoir beaucoup d'informations, donc je veux le mettre dans un volet de défilement. L'élément cliqué doit être sur un canevas 3D, donc j'essaie d'afficher un texte défilant sur l'objet. Idéalement, j'aimerais personnaliser la bordure du popup pour lui donner un effet "arrondi". –

+0

Eh bien, vous avez décrit ce que vous voulez - mais je ne peux pas déterminer si ce que vous voulez est possible parce que je ne sais pas quel type de composants/classes sont utilisés pour générer le popup. Il pourrait être peint directement sur la toile 3D ou pourrait utiliser l'une des classes que j'ai mentionnées dans mon commentaire précédent ... Avez-vous le code où la popup est lancée? Ou comment vous fournissez du contenu pour le popup? – Nate

Répondre

0

"Depuis la toile est AWT, je dois utiliser un ScrollPane au lieu d'un JScrollPane."

Pourquoi est-ce? Je pense que vous pouvez utiliser un JScrollPane.

Canvas extends java.awt.Component, et il y a un constructeur JScrollPane(java.awt.component component)

+0

La toile ne va pas dans le scrollpane. Le panneau de défilement fait partie d'un composant contextuel situé au-dessus du canevas. –

0

Je jouai d'abord avec l'idée d'utiliser un JScrollPane dans un JPopupMenu avec setLightWeightPopupEnabled(false). Cependant, ceci apparaît dans une nouvelle fenêtre de niveau supérieur au-dessus du composant - ainsi toutes les bordures arrondies sont dessinées au-dessus de la fenêtre de niveau supérieur. Il ressemble à un rectangle gris avec le JScrollPane dessiné sur le dessus avec des bords arrondis.

Ensuite, j'ai pensé à mettre le ScrollPane dans un Panel qui pourrait gérer le dessin de la bordure arrondie qui l'entoure. Malheureusement, les composants AWT n'ont pas la propriété setOpaque() comme les composants Swing, ils sont donc rectangulaires. Je pourrais copier la même couleur d'arrière-plan que le parent, mais si vous vouliez l'afficher en plus de certaines données, ce serait assez évident.

L'approche de compromis que j'ai finalement trouvé était d'avoir le composant Container peindre la bordure autour de l'enfant ScrollPane. Ceci est certainement plus d'une solution bidouille-y, mais il est le seul jusqu'à présent qui a travaillé ... voici le code final:

package stackoverflow; 

import java.awt.Color; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.List; 
import java.awt.Panel; 
import java.awt.Rectangle; 
import java.awt.ScrollPane; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class CanvasPopup { 

    public static void main(String[] args) { 
     final Frame f = new Frame("CanvasPopup"); 
     final ScrollPane scroll = new ScrollPane(); 
     final Panel c = new Panel(null) { 
      @Override 
      public void paint(Graphics g) { 
       g.setColor(Color.GREEN); 
       g.fillRect(0, 0, getWidth(), getHeight()); 

       if (scroll.isVisible()) { 
        g.setColor(Color.RED); 
        Rectangle bounds = scroll.getBounds(); 
        g.fillRoundRect(bounds.x - 10, bounds.y - 10, 
          bounds.width + 20, bounds.height + 20, 15, 15); 
       } 
      } 
     }; 

     final List list = new List(); 
     for (int i = 0; i<100; i++) { 
      list.add("Item " + i); 
     } 
     scroll.add(list); 
     scroll.setBounds(75, 75, 150, 150); 
     scroll.setVisible(false); 
     c.add(scroll); 

     c.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (!scroll.isVisible()) { 
        scroll.setLocation(e.getPoint()); 
       } 
       scroll.setVisible(!scroll.isVisible()); 
       c.repaint(); 
      } 
     }); 
     f.add(c); 

     f.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     f.setSize(300, 300); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

}