加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 窗口的内容在最小化时消失

发布时间:2020-12-14 05:08:52 所属栏目:Java 来源:网络整理
导读:我有一个简单的类,当鼠标拖动时绘制一条线或鼠标按下(释放)时画一个点. 当我最小化应用程序然后恢复它时,窗口的内容消失,除了最后一个点(像素).我知道方法super.paint(g)每次窗口改变时重新绘制背景,但无论我是否使用它,结果似乎都是一样的.它们之间的区别在
我有一个简单的类,当鼠标拖动时绘制一条线或鼠标按下(释放)时画一个点.

当我最小化应用程序然后恢复它时,窗口的内容消失,除了最后一个点(像素).我知道方法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); 
}

收集位置通常称为显示列表.大多数图形程序都使用它们

回复评论:

是的,我希望如此.我只是根据你的代码抛出一个想法给你一个起点.完全按照我的描述做几乎肯定是个坏主意.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读