Bonjour,

Je poste ici un bout de code très simple qui n'a aucun intérêt mais qui reflète les problèmes de base que j'ai avec Swing.
Je veux avoir par exemple un panneau dont la largeur fait 50 % de celle de ma JFrame, même après redimensionnement. J'utilise donc un setBounds() dans paintComponent (peut-être est-ce la première erreur d'ailleurs).

J'ajoute un JButton et un JLabel à mon panneau, qui est en BorderLayout().
Comme celui-ci n'a pas de taille lors de sa construction, l'ajout se fait apparemment sur toute la largeur de la frame, vu que mon panneau est censé occuper tout l'espace, je présume.

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
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class TestContPan extends JPanel implements ActionListener {
 
	public TestContPan() {
		setBackground(Color.blue);
		this.setLayout(new BorderLayout());
 
		bouton = new JButton("compte clics");
		bouton.addActionListener(this);
		add(bouton, "South");
 
		haut = new JLabel("clic pair");
		add(haut, "North");
	}
 
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		setBounds(0, 0, getParent().getWidth()*50/100, getParent().getHeight());
	}
 
	@Override
	public void update(Graphics g) {
		System.out.println("Appel à update(Graphics g)");
		if (offScreenImage == null)
			offScreenImage = createImage(getWidth(), getHeight());
 
		Graphics offGr = offScreenImage.getGraphics();
		paint(offGr);
		g.drawImage(offScreenImage, 0, 0, this);		
	}
 
	public void actionPerformed(ActionEvent ae) {
		if (cliqué) {
			haut.setText("clic pair");
			cliqué = false;
		}
		else {
			haut.setText("clic impair");
			cliqué = true;
		}
	}
 
	private Image offScreenImage = null;
	public JLabel haut;
	public JButton bouton;
	private boolean cliqué;
}
Lorsque le panneau est repeint en revanche, les bouton et label ne s'ajustent pas... c'est sans doute normal, mais que faut(il faire pour qu'ils s'ajustent eux aussi à la taille de mon panneau ? Quand même pas faire une classe dérivant de JButton et redéfinir la méthode paintComponent(), si ?

Deuxième question, j'ai souvent des problèmes de clignotement lors d'un rafraichissement de l'affichage. Là, typiquement, quand on clique sur le bouton pour modifier le texte du JLabel, ça clignote. J'ai cherché des trucs, et j'ai vu qu'on pouvait redéfinir la méthode update(Graphics g) qui est appelée avant (je crois) repaint(). Là ça ne marche pas du tout, elle n'est jamais appelée. Donc pourquoi ça clignote et comment l'éviter ?

Merci d'avance pour vos réponses qui combleront je l'espère mes graaaaves lacunes en Swing