Hello!
J'ai un petit problème que je n'arrive pas à résoudre avec des JPanel.
Je dessine une scène 2D dedans, tout va bien tant que mon JPanel garde le focus (il y a possibilité de bouger la scène avec la souris et la molette).
Mais lorsque je clique sur une autre fenêtre de mon interface (toutes les fenêtres sont des JInternalFrame dans un JDesktopPane), la vue du JPanel saute étrangement.
Et dès que je repaint ma vue, elle reprend la position d'avant le saut...
J'ai une application totalement différente (dans le sens où ce n'est pas du copier-coller du JPanel, mais du code neuf) et j'ai le même phénomène (sur Windows, OS X et Ubuntu)
Je vous met le code simplifié :
et la JInternalFrame qui contient tout ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 public class Panel2D extends JPanel implements MouseMotionListener, MouseWheelListener, MouseListener { private Point2D.Double center; private double scaleFactor; protected Point lastMousePosition; public Panel2D() { super(); lastMousePosition = null; panelBounds = new Rectangle2D.Double(); center = new Point2D.Double(getSize().getWidth() / 2.0, getSize().getHeight() / 2.0); // ... setScaleFactor(1.0 / 3.0); setBackground(Color.black); addMouseListener(this); addMouseMotionListener(this); addMouseWheelListener(this); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); AffineTransform saveG2D = g2d.getTransform(); g2d.setTransform(AffineTransform.getScaleInstance(scaleFactor, scaleFactor)); g2d.translate(getSize().getWidth() / 2.0 / scaleFactor, getSize().getHeight() / 2.0 / scaleFactor); g2d.translate(-center.x, center.y); // dessin des objets... g2d.setTransform(saveG2D); } public final void setScaleFactor(double _scaleFactor) { scaleFactor = _scaleFactor; if (scaleFactor > 3.0) { scaleFactor = 3.0; } if (scaleFactor < 0.1) { scaleFactor = 0.1; } panelBounds = new Rectangle2D.Double(center.x - getSize().getWidth() / scaleFactor, center.y - getSize().getHeight() / scaleFactor, getSize().getWidth() * 2.0 / scaleFactor, getSize().getHeight() * 2.0 / scaleFactor); repaint(); } public void mouseDragged(MouseEvent e) { if (lastMousePosition != null) { center.x -= (e.getLocationOnScreen().x - lastMousePosition.x) / (scaleFactor / 2.0); center.y += (e.getLocationOnScreen().y - lastMousePosition.y) / (scaleFactor / 2.0); } lastMousePosition = e.getLocationOnScreen(); repaint(); } public void mouseWheelMoved(MouseWheelEvent e) { setScaleFactor(scaleFactor - e.getWheelRotation() / 10.0); } public void mouseReleased(MouseEvent e) { lastMousePosition = null; } //... }
Est-ce que j'oublie de faire appel à une méthode particulière?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class Frame2D extends JInternalFrame implements Observer { private Panel2D panel; public Frame2D() { super("Affichage 2D des points HPS (données traitées)", true, //resizable true, //closable true, //maximizable true);//iconifiable setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); panel = new Panel2D(); setLayout(new BorderLayout()); add(panel); setVisible(true); pack(); } @Override public void update(Observable o, Object arg) { repaint(); } }
Merci d'avance pour toute aide
LePaK
PS : quelques images du phénomène
la première lorsque le panel a le focus
la deuxième juste après l'avoir perdu, on voit bien que la vue à fait un "saut"
Partager