Bonjour les amis, j'aimerai construire une interface graphique en java ou il y'a des bouttons déformés: c'est à dire les boutons ne sont plus des rectangles mais par exemple trapèzes. Merci de trouver un fichier joint qui explique.
Version imprimable
Bonjour les amis, j'aimerai construire une interface graphique en java ou il y'a des bouttons déformés: c'est à dire les boutons ne sont plus des rectangles mais par exemple trapèzes. Merci de trouver un fichier joint qui explique.
Tu peux partir d'un nouveau JComponent/JPanel ou bien etendre AbstractButton ou JButton puis y inclure une Shape ou un Path2D ou encore un Polygon qui represente la zone clicquable du bouton et utiliser cette meme forme pour dessiner le bouton a l'ecran en fonction de son etat (fourni par le ButtonModel si tu herites d'AbstractButton ou JButton).
Grosso modo.
Il faudra egalement gerer les events de la souris pour verifier que tu es bien dans la zone (buttonShape.contains(event.getX(), event.getY()) pour des truc comme l'effet rollover lorsque le curseur est sur le bouton ou quand tu cliques dedans.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public class MyButton extends AbstractButton { private Shape buttonShape; public MyButton(String text, Icon icon) { [...] setOpaque(false); setPreferredSize(precalculateShapeAndPreferredSize()); } /** Mettre des propertyChangeListener sur les proprietes du bouton (text, icon, font, etc...) qui peuvent influencer la taille et recalculer si necessaire. */ private Size precalculateShapeAndPreferredSize() { // Caculer la taille de la forme du bouton en fonction de son texte, police, icon, marges et decos. ... } @Override protected void paintComponent(Graphics g) { Dimension size = getSize(); Insets insets = getInsets(); int width = size.width - (insets.left + insets.right); int height = size.height - (insets.top + insets.bottom); Graphics2D g2d = (Graphics2D)g.create(insets.left, insets.top, width, height); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); try { g2d.setStroke(new BasicStroke(1f)); g2d.setPaint(Color.BLACK); g2d.draw(buttonShape); } catch (Exception e) { g2d.dispose(); } } }
Tu peux egalement utiliser un JXButton de SwingX et bosser avec des Painter histoire de te simplifier la tache au niveau du rendu graphique (mais ce n'est pas une solution miracle non-plus).