JScrollPane 위에 빨간색 사각형을 그리려합니다. 아래 코드는 괜찮습니다.하지만 뷰포트를 너무 빠르게 스크롤하면 빨간색 사각형이 위아래로 움직입니다. JScrollPane의 자체가 고정되어 있기 때문에 JScrollPane의 뷰포트에 정적 이미지 그리기
이
날 홀수 강타, 그래서 스윙이 그 안에 그려진 구성 요소 주위에 이동하려고하지 않을 생각했습니다. 실제로 일어나는 현상은 빨간색 사각형이 이동하는 그래픽을 표시하는 뷰포트와 연결된다는 것입니다.어쨌든 붉은 색 사각형이 점프하여 목록 위에 빨간색 사각형이 성공적으로 그려지지 않도록하려면 어떻게합니까? 어쩌면 내가 잘못된 접근 방식을 취하고있는 것일 수도 있습니다.
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();
}
});
}
}
이 솔루션이 너무 강력 될 수도 있지만 당신은'유리 Pane'에 그리기 시도 할 수 있습니다. 예를 들어 - http://stackoverflow.com/questions/6609888/drawing-between-2-images-in-1-jpanel/6610064#6610064하지만 잘못 될 수 있으며이 솔루션은 적용되지 않을 수 있습니다. – mre
@ masson : 내 대답에 편집을 참조하십시오. –