Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形和SwingWorker_Java_Swingworker_Graphing - Fatal编程技术网

Java 图形和SwingWorker

Java 图形和SwingWorker,java,swingworker,graphing,Java,Swingworker,Graphing,我试图画一个有几千个点的动态图。我正在使用SwingWorker类来获取图形对象作为参数。我在SwingWorker类的构造函数中初始化graphics对象,然后在done()方法中调用主绘图函数doGraph(),也就是说,在完成所有计算之后。我在绘画方面有问题,不知道发生了什么。如果我从SwingWorker类的构造函数调用doGraph(),则代码可以工作,但如果我将其放入done(),则代码不能工作 非常感谢您的帮助。为了便于理解,我简化了代码。为了简单起见,我只是想在doGraph()

我试图画一个有几千个点的动态图。我正在使用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(真);
}
});
}
}
}