我有一个简单的类,当鼠标拖动时绘制一条线或鼠标按下(释放)时画一个点.
当我最小化应用程序然后恢复它时,窗口的内容消失,除了最后一个点(像素).我知道方法super.paint(g)每次窗口改变时重新绘制背景,但无论我是否使用它,结果似乎都是一样的.它们之间的区别在于,当我不使用它时,窗口上绘制的不仅仅是一个像素,而不是我的所有绘画.我怎样才能解决这个问题?
这是班级.
- package painting;
- import java.awt.*;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseMotionAdapter;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- class CustomCanvas extends Canvas{
- Point oldLocation= new Point(10,10);
- Point location= new Point(10,10);
- Dimension dimension = new Dimension(2,2);
- CustomCanvas(Dimension dimension){
- this.dimension = dimension;
- this.init();
- addListeners();
- }
- private void init(){
- oldLocation= new Point(0,0);
- location= new Point(0,0);
- }
- public void paintLine(){
- if ((location.x!=oldLocation.x) || (location.y!=oldLocation.y)) {
- repaint(location.x,location.y,1,1);
- }
- }
- private void addListeners(){
- addMouseListener(new MouseAdapter(){
- @Override
- public void mousePressed(MouseEvent me){
- oldLocation = location;
- location = new Point(me.getX(),me.getY());
- paintLine();
- }
- @Override
- public void mouseReleased(MouseEvent me){
- oldLocation = location;
- location = new Point(me.getX(),me.getY());
- paintLine();
- }
- });
- addMouseMotionListener(new MouseMotionAdapter() {
- @Override
- public void mouseDragged(MouseEvent me){
- oldLocation = location;
- location = new Point(me.getX(),me.getY());
- paintLine();
- }
- });
- }
- @Override
- public void paint(Graphics g){
- super.paint(g);
- g.setColor(Color.red);
- g.drawLine(location.x,oldLocation.x,oldLocation.y);
- }
- @Override
- public Dimension getMinimumSize() {
- return dimension;
- }
- @Override
- public Dimension getPreferredSize() {
- return dimension;
- }
- }
- class CustomFrame extends JPanel {
- JPanel displayPanel = new JPanel(new BorderLayout());
- CustomCanvas canvas = new CustomCanvas(new Dimension(200,200));
- public CustomFrame(String titlu) {
- canvas.setBackground(Color.white);
- displayPanel.add(canvas,BorderLayout.CENTER);
- this.add(displayPanel);
- }
- }
- public class CustomCanvasFrame {
- public static void main(String args[]) {
- CustomFrame panel = new CustomFrame("Test Paint");
- JFrame f = new JFrame();
- f.add(panel);
- f.pack();
- SwingConsole.run(f,700,700);
- }
- }
解决方法
您没有存储您正在绘制的点的状态.重新绘制面板时,它仅显示其绘制的最后一点的信息.
您需要有一个Points集合,例如ArrayList< Point> location = new ArrayList< Point>();
然后,在你的监听器中:location.add(new Point(me.getX(),me.getY()));
最后,在paintLine()中:
- for (Point location : locations) {
- repaint(location.x,1);
- }
收集位置通常称为显示列表.大多数图形程序都使用它们
是的,我希望如此.我只是根据你的代码抛出一个想法给你一个起点.完全按照我的描述做几乎肯定是个坏主意.