我用自定义类构造了一个列表 使用变量里面的参数来绘制图形 点击button之后 修改列表的数据 调用repaint重绘 但是并不能消除之前的图形
不过如果直接使用一个变量t作为fillOval的部分参数来绘制图形 用同样的原理却能清除图形
代码如下
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import javax.swing.*;
//import javax.script.ScriptEngine;
//import javax.script.ScriptEngineManager;
//import javax.script.ScriptException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
class Bg{
String col;
double xMin,xMax,yMin,yMax;
}
class Pt{
double x,y;
}
class Points{
Boolean pad;
String col;
int wid,radius;
ArrayList<Pt> p=new ArrayList<Pt>();
}
class Lines{
String col;
int wid;
ArrayList<Pt> p=new ArrayList<Pt>();
}
class Line{
String col,slope; //斜率
int wid;
Pt p;
}
class Curve{
String col,function;
int wid,s,e;
}
class Shape{
String col,type;
int wid;
double width,height,x,y;
Boolean pad;
}
class Scale{
String col,direction;
int wid,from,amount,precision;
double pos,step;
public String toString()
{
return col+"\n"+wid+"\n"+direction+"\n"+pos+"\n"+from+"\n"+step+"\n"+amount+"\n"+precision+"\n";
}
}
public class ConfigurableDrawing{
int dFlag=0,eFlag=0;
Scale ax;
int length;
int t,h;
double xMax=1.0,yMax=1.0,xFrom=0,yFrom=0;
JFrame frame=new JFrame("可配置绘图软件");
MyCanvas canvas = new MyCanvas();
JButton drawBtn=new JButton("绘图");
JButton exmBtn=new JButton("配置样例");
JTextArea text=new JTextArea(20,50);
ArrayList<Scale> s=new ArrayList<Scale>();
public ConfigurableDrawing()
{
frame.setBounds(100,100,1100,700);
//设置分割面板
JSplitPane sp=new JSplitPane();
//支持连续布局
sp.setContinuousLayout(true);
sp.setDividerLocation(700);
sp.setDividerSize(4);
JPanel p1=new JPanel(new BorderLayout());
JPanel p2=new JPanel(new GridLayout(1,2,10,10));
JButton drawBtn=new JButton("绘图");
JButton exmBtn=new JButton("配置样例");
p2.add(drawBtn);
p2.add(exmBtn);
p1.add(p2,BorderLayout.NORTH);
text.setFont(new Font("楷体",0,16));
JScrollPane jsp=new JScrollPane(text);
p1.add(jsp);
sp.setLeftComponent(canvas);
sp.setRightComponent(p1);
frame.add(sp);
drawBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dFlag=1;
//s.get(0).step=0.2;
creatXml();
saveValue();
canvas.repaint();
}
});
exmBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
String xmlStr=turnXmltoString();
text.append(xmlStr);
// yMax=2.0;
// step=0.2;
// precision=2;
// yFrom=0.2;
}
});
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public String turnXmltoString()
{
try {
// 读取 xml 文件
File fileinput = new File("test.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fileinput);
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
return writer.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public Document saveStr(String str)
{
Document doc=null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
InputSource is = new InputSource(new StringReader(str));
try {
builder = factory.newDocumentBuilder();
doc = builder.parse(is);
}
catch(Exception e){
e.printStackTrace();
}
return doc;
}
public void creatXml()
{
try {
// 判断文件是否存在,如存在就删掉它
File file = new File("test.xml");
if (file.exists())
file.delete();
String str=text.getText();
// System.out.println(str);
// String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><bg> <col> 255,255,255 </col> <xRange> -0.1, 1.1 </xRange> <yRange> -0.1, 1.1 </yRange> </bg>";
str=str.replaceAll("\r\n| ", "");
// System.out.println(str);
Document document=saveStr(str);
/** 将document中的内容写入文件中 */
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new FileOutputStream("test.xml"));
transformer.transform(source, result);
}
catch(Exception e){
e.printStackTrace();
}
}
public void saveValue()
{
try{
File f=new File("test.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList n1 = doc.getElementsByTagName("scale");
//System.out.println(nl.getLength());
for (int i=0;i<n1.getLength();i++)
{
Scale sc=new Scale();
Element b=(Element)n1.item(i); //获取第一个scale结点
sc.col=b.getElementsByTagName("col").item(0).getFirstChild().getNodeValue().trim();
sc.wid=Integer.parseInt(b.getElementsByTagName("wid").item(0).getFirstChild().getNodeValue().trim());
sc.direction=b.getElementsByTagName("direction").item(0).getFirstChild().getNodeValue().trim();
sc.pos=Double.parseDouble(b.getElementsByTagName("pos").item(0).getFirstChild().getNodeValue().trim());
sc.from=Integer.parseInt(b.getElementsByTagName("from").item(0).getFirstChild().getNodeValue().trim());
sc.step=Double.parseDouble(b.getElementsByTagName("step").item(0).getFirstChild().getNodeValue().trim());
sc.amount=Integer.parseInt(b.getElementsByTagName("amount").item(0).getFirstChild().getNodeValue().trim());
sc.precision=Integer.parseInt(b.getElementsByTagName("precision").item(0).getFirstChild().getNodeValue().trim());
s.add(sc);
}
// for(int i=0;i<s.size();i++)
// {
// Scale a=s.get(i);
// System.out.println(a.toString());
// }
}catch(Exception e){
e.printStackTrace();
}
}
class MyCanvas extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -4279250266143507850L;
public Color getColor(String c)
{
Color color;
try {
Field field = Class.forName("java.awt.Color").getField(c);
color = (Color)field.get(null);
} catch (Exception e) {
color = null; // Not defined
}
return color;
}
@Override
public void paintComponent(Graphics g)
{
if(dFlag==1)
{
Graphics2D g2 = (Graphics2D)g;
// 下面这句话把整个的Canvas清空,以便下次绘制,这句话在画图中很重要:
g2.clearRect(0, 0, (int)getBounds().getWidth(), (int)getBounds().getHeight());
for(int i=0;i<s.size();i++)
{
ax=s.get(i);
g2.setColor(getColor(ax.col));
g2.setStroke(new BasicStroke(ax.wid));
length=50*ax.amount+50;
t=50;h=600;
BigDecimal bStep = new BigDecimal(ax.step+"");
BigDecimal c=new BigDecimal(ax.from+"");
if(ax.direction.equals("x"))
{
g2.drawLine(50, h, length, h); //x轴
for(int j=0;j<=ax.amount;j++)
{
//System.out.println(t+" "+base);
g2.drawLine(t, h, t, h-5);
c=c.setScale(ax.precision, RoundingMode.HALF_UP);
g2.drawString(c+"", t-6, h+10);
t+=50;
c=c.add(bStep);
}
}
else {
length=ax.amount*50;
t=h;c=new BigDecimal(yFrom+"");
g2.drawLine(50, h-length, 50, h); //y轴
for(int j=0;j<=ax.amount;j++)
{
g2.drawLine(50, t, 50+5, t);
//System.out.println("50"+" "+t);
c=c.setScale(ax.precision, RoundingMode.HALF_UP);
g2.drawString(c+"", 25, t+5);
t-=50;
c=c.add(bStep);
}
}
//g2.fillOval((int) (0.2*t+26), (int)(0.2*t+26), 10,10);
}
}
}
}
public static void main(String[] args)
{
new ConfigurableDrawing();
}
}
把paintComponent方法改为paint方法试试。