亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不清除窗口的情況下在Swing中重新繪制?

如何在不清除窗口的情況下在Swing中重新繪制?

qq_笑_17 2022-09-14 17:42:47
我正在實現一個簡單的方法,可以像現實生活中用紙和鉛筆一樣繪制項目,而無需在每次繪制對象時清除整個頁面。Canvas到目前為止,我有什么...A實現圖紙:Canvaspublic class Canvas extends JPanel {    private final Random random = new Random();    public Canvas() {        setOpaque(false); // I thought setting this flag makes the drawn pixels be preserved...    }    @Override    public Dimension getPreferredSize() {        return new Dimension(640, 480);    }    @Override    public void paintComponent(Graphics g) {        super.paintComponent(g);        g.drawOval(random.nextInt(getWidth()), random.nextInt(getHeight()), 5, 5);    }}作為實際窗口:Windowpublic class Window extends JFrame {    public Window(Canvas canvas) {        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        add(canvas);        pack();        setVisible(true);    }}以及應用程序的入口點。還啟動一個計時器,以便每秒調用 on 以強制繪制另一個圓圈。ControllerrepaintCanvaspublic class Controller {    public static void main(String[] args) {        Canvas canvas = new Canvas();        SwingUtilities.invokeLater(() -> new Window(canvas));        new Timer(1000, e -> canvas.repaint()).start();    }}問題是,每當畫一個新圓圈時,前一個圓圈就會被清除。似乎仍然有一些過程填充或整個白色。JPanelJFrame
查看完整描述

2 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

在《搖擺》中繪畫是破壞性的。期望的要求是,每次對組件進行涂漆時,都要再次從頭開始涂漆。

您需要定義一個模型來維護所需的信息,以便從頭開始恢復狀態。

然后,您的繪畫例程將迭代此模型并每次繪制元素。

這樣做的好處是允許您修改模型,刪除或插入元素,這將允許您簡單地更新所繪制的內容。

或者,您可以使用“緩沖區”(即)來完成所有繪制,然后每次繪制組件時,只需將圖像繪制到組件上即可。BufferedImage

但是,這意味著您無法撤消或分層繪畫,而是直接繪制到圖像上。它還使調整繪圖圖像區域的大小變得更加困難,因為您需要手動進行這些更新,而基于“模型”的實現更具適應性


查看完整回答
反對 回復 2022-09-14
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

考慮調用重繪 (...) 的替代構造函數

重繪(長 tm, int x, int y, int 寬度, int 高度)

這允許您設置要重繪的指定區域。

此外,您只需將繪制的內容存儲在列表中,然后在調用重繪后將繪圖重新打印到畫布上。


查看完整回答
反對 回復 2022-09-14
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號