我正在實現一個簡單的方法,可以像現實生活中用紙和鉛筆一樣繪制項目,而無需在每次繪制對象時清除整個頁面。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
但是,這意味著您無法撤消或分層繪畫,而是直接繪制到圖像上。它還使調整繪圖圖像區域的大小變得更加困難,因為您需要手動進行這些更新,而基于“模型”的實現更具適應性

catspeake
TA貢獻1111條經驗 獲得超0個贊
考慮調用重繪 (...) 的替代構造函數
重繪(長 tm, int x, int y, int 寬度, int 高度)
這允許您設置要重繪的指定區域。
此外,您只需將繪制的內容存儲在列表中,然后在調用重繪后將繪圖重新打印到畫布上。
添加回答
舉報
0/150
提交
取消