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);
}
}
Vous avez mentionné popups dans un de vos commentaires - pouvez-vous donner plus de détails? PopupMenu? JPopupMenu? Popup/PopupFactory? – Nate
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". –
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