[英]using Graphic g of Paint() outside in java
嘿,我想创建一个applet“白板”,以便在浏览时进行粗略的工作。 它包括绘图,粗加工,书写等功能。 当用户单击并拖动鼠标时,将使用drawLine命令绘制路径。 我创建了一个ObjectDrawer类,它侦听MouseDrag事件,然后使用Graphics g绘制对象。 我使用此命令获取图形g,但我知道它不正确,但是找不到解决方案Graphic g = obj.getGraphics();。
此外,在创建Applet时,我们不会创建任何初始化该进程的对象,而是会自动调用init(),因此如何使用applet类的变量。我的意思是如果我为Whiteboard类创建了一个对象,那么这些变量将具有相同的含义始终保持价值?无论我创建多少个对象? 例如,假设小程序正在使用drawstatus变量作为圆,现在我创建一个对象obj.obj.drawStatus是线还是圆?
public class WhiteBoard extends Applet {
public static int lastx=0;public static int lasty=0;public static String drawStatus="line";
public void init(){
setLayout(new BorderLayout());
MainPanel p=new MainPanel();
add(p,BorderLayout.SOUTH);
setBackground(Color.WHITE);
setForeground(Color.BLUE);
addMouseListener(new PositionRecorder());
addMouseMotionListener(new ObjectDrawer());
}
public void record(int x,int y){
lastx=x;
lasty=y;
}
}
public class ObjectDrawer extends MouseAdapter {
WhiteBoard obj=new WhiteBoard();
int lastx=WhiteBoard.lastx;
int lasty=WhiteBoard.lasty;int x,y;
String status=WhiteBoard.drawStatus;
public void MouseDragged(MouseEvent event){
x=event.getX();
y=event.getY();
Graphics g=obj.getGraphics();
g.setColor(Color.cyan);
if(status.equals("line")){
g.drawLine(lastx,lasty,x,y);
}
if(status.equals("rectangle")){
g.drawRect(lastx,lasty,x-lastx,y-lasty);
}
if(status.equals("circle")){
int r=(int)Math.sqrt(Math.pow(x-lastx,2)+Math.pow(y-lasty, 2));
g.drawOval(lastx,lasty,2*r,2*r);
}
}
}
g(Graphics)会在applet或其他地方绘制吗?创建对象并使用getGraphics是否正确?因为初始化applet的对象和此objent相同。我的意思是只有初始化applet的obj才可以。更改图形?
public class PositionRecorder extends MouseAdapter {
WhiteBoard obj=new WhiteBoard();
public void mouseEntered(MouseEvent event) {
//requestFocus(); // Plan ahead for typing
obj.record(event.getX(), event.getY());
}
public void mousePressed(MouseEvent event) {
obj.record(event.getX(), event.getY());
}
}
抱歉,这个问题有点冗长和令人困惑,因为我无法理解真正的问题是什么。 感谢您阅读EDIT:我的新代码有效.Pleasse解释了为什么现在可以正常工作;并且小程序中的面板(按钮)仅在将鼠标移至南部区域时才可见,否则根本看不见吗?我必须设置setVisible( true)在小程序面板中?
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.event.MouseEvent;
public class WhiteBoard extends JApplet implements MouseListener,MouseMotionListener,KeyListener{
public int lastx=0;public int lasty=0;
Graphics g;Font f;
public void init(){
MainPanel p=new MainPanel();
getContentPane().add(BorderLayout.SOUTH,p);
setBackground(Color.WHITE);
addMouseListener(this);
addMouseMotionListener(this);
addKeyListener(this);
g=getGraphics();g.setColor(Color.BLUE);
f=new Font("SERIF",Font.BOLD,16);
g.setFont(f);
}
public void record(int x,int y){
lastx=x;
lasty=y;
}
public void paint(Graphics g){
}
public void mouseMoved(MouseEvent event){
record(event.getX(),event.getY());
}
public void mouseEntered(MouseEvent event) {
requestFocus(); // Plan ahead for typing
record(event.getX(), event.getY());
}
public void mousePressed(MouseEvent event) {
record(event.getX(), event.getY());
}
public void mouseDragged(MouseEvent event){
int x,y;
x=event.getX();
y=event.getY();
g.drawLine(lastx,lasty,x,y);
record(x,y);
}
public void keyTyped(KeyEvent ke){
String msg=String.valueOf(ke.getKeyChar());
g.drawString(msg,lastx,lasty);
record(lastx+9,lasty);
}
public void keyReleased(KeyEvent ke){}
public void keyPressed(KeyEvent ke){}
public void mouseClicked(MouseEvent event){}
public void mouseExited(MouseEvent event){}
public void mouseReleased(MouseEvent event){}
}
您需要重写applet的paint()方法。
@override
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.cyan);
if(status.equals("line")){
g.drawLine(lastx,lasty,x,y);
}
if(status.equals("rectangle")){
g.drawRect(lastx,lasty,x-lastx,y-lasty);
}
if(status.equals("circle")){
int r=(int)Math.sqrt(Math.pow(x-lastx,2)+Math.pow(y-lasty, 2));
g.drawOval(lastx,lasty,2*r,2*r);
}
}
在mouseDragged()中,您需要将x和y保存为实例变量
之后,在mouseDragged()中调用repaint()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.