Java 图形和SwingWorker
我试图画一个有几千个点的动态图。我正在使用SwingWorker类来获取图形对象作为参数。我在SwingWorker类的构造函数中初始化graphics对象,然后在done()方法中调用主绘图函数doGraph(),也就是说,在完成所有计算之后。我在绘画方面有问题,不知道发生了什么。如果我从SwingWorker类的构造函数调用doGraph(),则代码可以工作,但如果我将其放入done(),则代码不能工作 非常感谢您的帮助。为了便于理解,我简化了代码。为了简单起见,我只是想在doGraph()中画一个矩形Java 图形和SwingWorker,java,swingworker,graphing,Java,Swingworker,Graphing,我试图画一个有几千个点的动态图。我正在使用SwingWorker类来获取图形对象作为参数。我在SwingWorker类的构造函数中初始化graphics对象,然后在done()方法中调用主绘图函数doGraph(),也就是说,在完成所有计算之后。我在绘画方面有问题,不知道发生了什么。如果我从SwingWorker类的构造函数调用doGraph(),则代码可以工作,但如果我将其放入done(),则代码不能工作 非常感谢您的帮助。为了便于理解,我简化了代码。为了简单起见,我只是想在doGraph()
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.RenderingHints.Key;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
@SuppressWarnings("serial")
public class UIGraph extends JPanel {
private double minX, maxX;
private double minY, maxY;
private SWPaint swPaint; //Swing Worker object
private Graphics2D g2D;
public Key key = RenderingHints.KEY_ANTIALIASING;
public Object obj = RenderingHints.VALUE_ANTIALIAS_ON;
private int labelPadding = 25;
private int padding = 25;
private int padConst = (2 * padding) - labelPadding;
private double xScale;
private double yScale;
/**
* Crate Panel
*/
private void createUI() {
setBackground(new Color(245, 255, 250));
setLayout(new BorderLayout(0, 0));
}
/**
* Constructor
*
*/
public UIGraph() {
createUI();
getMinMax();
}
/**
* Paint Component. Do all the calculations and graphing
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (swPaint != null) {
if (!swPaint.isDone()) { // The swing worker is busy with tasks. Set Visibility to false and return.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(false);
}
});
return;
}
}
swPaint = new SWPaint(g); //Create a swing worker class, pass graphics object as argument
swPaint.execute();
}
}
/**
* Get the Min and Max values of Data
*/
private void getMinMax() {
//obtain min and max values
}
/**
* Main method for graphing
*
* @param g2D
*/
private void doGraph() {
xScale = (double) (getWidth() - padConst) / (maxX - minX);
yScale = (double) (getHeight() - padConst) / (maxY - minY);
g2D.setColor(Color.WHITE);
g2D.fillRect(padding + labelPadding, padding, getWidth() - (2 * padding) - labelPadding, getHeight() - 2 * padding
- labelPadding);
g2D.setColor(Color.BLACK);
}
/**
* Swing Worker to handle Paint
*
*/
public class SWPaint extends SwingWorker<Void, Void> {
/**
* Constructor
*
* @param g
*/
public SWPaint(Graphics g) {
g2D = (Graphics2D) g;
g2D.setRenderingHint(key, obj);
//doGraph() //This works
}
/**
* Do graphing calculations here
*/
@Override
protected Void doInBackground() throws Exception {
// do all calculations here
return null;
}
/*
* The SW is done. Paint the graph. Set Visibility to true
*/
protected void done() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
doGraph(); //This doesn`t work here.
setVisible(true);
}
});
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.RenderingHints;
导入java.awt.RenderingHints.Key;
导入javax.swing.JPanel;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
@抑制警告(“串行”)
公共类UIGraph扩展了JPanel{
私人双minX,maxX;
私人双米尼,马克西;
私有SWPaint SWPaint;//Swing Worker对象
私有图形2d-g2D;
公钥Key=RenderingHints.Key\u抗锯齿;
public Object obj=RenderingHints.VALUE\u ANTIALIAS\u ON;
私有int-labelPadding=25;
私有整数填充=25;
私有int padConst=(2*填充)-标签填充;
私人双xScale;
私人双yScale;
/**
*板条箱面板
*/
私有void createUI(){
挫折背景(新颜色(245255250));
setLayout(新边界布局(0,0));
}
/**
*建造师
*
*/
公共图形(){
createUI();
getMinMax();
}
/**
*绘制组件。完成所有计算和绘图
*/
@凌驾
受保护组件(图形g){
超级组件(g);
if(swPaint!=null){
如果(!swPaint.isDone()){//swing worker正在忙于执行任务。请将可见性设置为false并返回。
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
setVisible(假);
}
});
返回;
}
}
swPaint=new swPaint(g);//创建一个swing worker类,将图形对象作为参数传递
swPaint.execute();
}
}
/**
*获取数据的最小值和最大值
*/
私有void getMinMax(){
//获取最小值和最大值
}
/**
*作图的主要方法
*
*@param g2D
*/
私有空穴道图(){
xScale=(double)(getWidth()-padConst)/(maxX-minX);
yScale=(双精度)(getHeight()-padConst)/(maxY-minY);
g2D.setColor(Color.WHITE);
g2D.fillRect(padding+labelPadding,padding,getWidth()-(2*padding)-labelPadding,getHeight()-2*padding
-标签填充);
g2D.setColor(Color.BLACK);
}
/**
*摇摆工人搬运油漆
*
*/
公共类SWPaint扩展SwingWorker{
/**
*建造师
*
*@param g
*/
公共SWPaint(图形g){
g2D=(图2d)g;
g2D.setRenderingHint(键,obj);
//doGraph()//这是可行的
}
/**
*在这里做图形计算
*/
@凌驾
受保护的Void doInBackground()引发异常{
//在这里进行所有计算
返回null;
}
/*
*SW完成。绘制图形。将可见性设置为true
*/
受保护的void done(){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
doGraph();//这在这里不起作用。
setVisible(真);
}
});
}
}
}