J'essaie de dessiner un carré rouge sur un JScrollPane. Le code que j'ai ci-dessous fait un bon travail de ceci, mais parfois quand je fais défiler la fenêtre trop vite, le carré rouge saute vers le haut ou vers le bas.Dessiner une image statique sur la fenêtre d'un JScrollPane
Cela m'a frappé comme étrange depuis le JScrollPane lui-même est stationnaire, donc je suppose swing ne tenterait pas de déplacer les pièces peintes à l'intérieur. J'imagine que ce qui se passe réellement, c'est que le carré rouge est associé à la fenêtre d'affichage, qui affiche les graphiques qui bougent.
Quoi qu'il en soit, comment puis-je empêcher le carré rouge de sauter et dessiner avec succès un carré rouge sur la liste? Peut-être que je prends la mauvaise approche tout à fait.
package components;
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
@SuppressWarnings("serial")
public class DialogWithScrollPane extends JFrame {
public DialogWithScrollPane() {
super();
setResizable(false);
Container pane = getContentPane();
Vector<Object> listOfStuff = new Vector<Object>();
for (int i = 0; i < 100; i++) {
listOfStuff.add(Integer.toString(i));
}
final JScrollPane scrollPane = new JScrollPane() {
public void paint(Graphics g) {
System.out.println("JScrollPane.paint() called.");
super.paint(g);
g.setColor(Color.red);
g.fillRect(20, 50, 100, 200);
}
};
JList list = new JList(listOfStuff) {
public void paint(Graphics g) {
System.out.println("JList.paint() called.");
super.paint(g);
// Well, I could do this...
//
// scrollPane.repaint();
//
// ...and it would solve the problem, but it would also result in an
// infinite recursion since JScrollPane.paint() would call this
// function again.
}
};
// Repaint the JScrollPane any time the viewport is moved or an item in the
// list is selected.
scrollPane.getViewport().addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
scrollPane.repaint();
}
});
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
scrollPane.repaint();
}
});
scrollPane.setViewportView(list);
pane.add(scrollPane);
setMinimumSize(new Dimension(300, 300));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(500, 250);
setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DialogWithScrollPane();
}
});
}
}
Cette solution pourrait être trop robuste pour cela, mais vous pouvez essayer de dessiner sur le verre 'Pane'. Par exemple - http://stackoverflow.com/questions/6609888/drawing-between-2-images-in-1-jpanel/6610064#6610064 Mais je peux me tromper et cette solution peut ne pas être applicable. – mre
@masson: s'il vous plaît voir modifier à ma réponse –