Re: [問題] 在JPanel上面繪圖的完整準備工作?
※ 引述《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
11/18 16:36, 1F
→
11/18 16:37, , 2F
11/18 16:37, 2F
→
11/20 23:39, , 3F
11/20 23:39, 3F
→
11/20 23:40, , 4F
11/20 23:40, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):