Re: [問題] 在JPanel上面繪圖的完整準備工作?

看板java作者 (習慣成自然)時間14年前 (2010/11/15 18:36), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《olys (查無暱稱)》之銘言: : ※ 引述《olys (查無暱稱)》之銘言: : : 一直找不到一個完整的教學 =_=........ : : 現在好像只有看到 : : 1.要創一個新的class是繼承JPanel, 裡面到底要加什麼不知道, : : 然後宣告Panel時要用那個Class : : 2.要加一行 Graphics g = gPanel.getGraphics(); , 要放在哪裡不知道 : : 然後以上備齊似乎就可以g.drawline等等亂畫了 : : 可是完整的過程是怎麼樣啊 orz : 我想我直接說我要作的功能好了,有可能是因為這樣所以不能用方法2 : 我現在宣告了一個JPanel,叫作gPanel : 然後我宣告了一個滑鼠監聽器,現在已確定可以抓到滑鼠游標&點擊會紀錄座標 : 現在我想在mouseClicked裡新增一個功能,除了會紀錄點擊座標外, : 還會在gPanel上畫上一個* : 我試著將gPanel在宣告設成Visible, : 也將Graphics g = gPanel.getGraphics(); 放在Class中當全堿變數, : 但是我在mouseClicked裡加上一句g.drawString("*",e.getX(), e.getY()); : 再按下eclipse的run就會跑出錯誤 orz, 但是eclipse並抓不到這句有什麼問題 : 我試過把Graphics g = gPanel.getGraphics();放在MouseListener下,也會有同樣問題 : 我試過很多關鍵字,真的找不到完整的教學ˊˋ : 如果有版友知道還請提供 import java.awt.Dimension; import java.awt.Graphics; import javax.swing.*; public class DrawingPanel extends JPanel { public static void main(String[] args) { JFrame frame = new JFrame("test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawingPanel()); frame.pack(); frame.setVisible(true); } @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 把所有想畫的東西利用這個Graphics物件g畫出來!!! } } 這個可以應付大部份簡單的工作 如果需要滑鼠或是鍵盤,可以直接實作相對應的Listener import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.*; public class DrawingPanel extends JPanel implements MouseListener{ public DrawingPanel() { addMouseListener(this); } ArrayList<Point> list = new ArrayList<Point>(); @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for(Point pt : list){ g.drawRect(pt.x,pt.y,5,5); } } @Override public void mouseClicked(MouseEvent e) { list.add(new Point(e.getX(),e.getY())); repaint(); } @Override public void mousePressed(MouseEvent e) {} @Override public void mouseReleased(MouseEvent e) {} @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) {} public static void main(String[] args) { JFrame frame = new JFrame("test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawingPanel()); frame.pack(); frame.setVisible(true); } } 由於Swing已經內含了Double Buffering所以不需要自己處理 只要overwrite paintComponent方法即可 要注意的是是沒有s的paintComponent而不是paintComponents 上下兩段程式碼只有差別在增加了MouseListener 並且新增了資料結構來儲存滑鼠按下了的位置 並且要注意當更新了資料(mouseClicked)之後,需要利用repaint來重新繪圖 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.25.222

11/18 16:36, , 1F
paintComponent這樣宣告的話,在其他地方繪圖就不用再宣告
11/18 16:36, 1F

11/18 16:37, , 2F
一次Graphic g了?另外repaint是等於刷新畫面的意思吧?
11/18 16:37, 2F

11/20 23:39, , 3F
swing已經把流程都包好了,最好是在paintComponent裡面
11/20 23:39, 3F

11/20 23:40, , 4F
繪圖就好了。
11/20 23:40, 4F
文章代碼(AID): #1CuNsWJt (java)
文章代碼(AID): #1CuNsWJt (java)