作者progden (习惯成自然)
看板java
标题Re: [问题] 在JPanel上面绘图的完整准备工作?
时间Tue Nov 16 02:36:14 2010
※ 引述《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
1F:推 olys:paintComponent这样宣告的话,在其他地方绘图就不用再宣告 11/18 16:36
2F:→ olys:一次Graphic g了?另外repaint是等於刷新画面的意思吧? 11/18 16:37
3F:→ progden:swing已经把流程都包好了,最好是在paintComponent里面 11/20 23:39
4F:→ progden:绘图就好了。 11/20 23:40