Java GWT XY绘图

Java GWT XY绘图,java,gwt,Java,Gwt,我正在寻找创建xy图的GWTAPI/示例。下面是我在powerpoint中制作的示例图像。将有两个类似下面示例的其他绘图,每个点都可以单击,然后在另一个绘图上高亮显示。有没有一种方法可以在GWT中使用java而不是javascript来实现这一点。。。我已经找到了很多swing演示和javascript,但是正在寻找一些纯java的gwt 多谢各位 您需要一个面板。JPanel如果使用swing,用于gwt的面板。。。然后你在上面画 或者看看这是否有帮助 package graphics;

我正在寻找创建xy图的GWTAPI/示例。下面是我在powerpoint中制作的示例图像。将有两个类似下面示例的其他绘图,每个点都可以单击,然后在另一个绘图上高亮显示。有没有一种方法可以在GWT中使用java而不是javascript来实现这一点。。。我已经找到了很多swing演示和javascript,但是正在寻找一些纯java的gwt

多谢各位


您需要一个面板。JPanel如果使用swing,用于gwt的面板。。。然后你在上面画

或者看看这是否有帮助

 package graphics;

 import java.awt.*;
 import java.awt.geom.*;
 import java.util.*;

public class GraficPainter
{
public final static Boolean drawMonitor = new Boolean(true);
public static final Stroke line = new BasicStroke();
public static final Stroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT,
                BasicStroke.JOIN_BEVEL, 1.0f, new float[] { 5.0f, 15.0f }, 0f);

public static void drawGrafic(Graphics2D g2, Point2D start, Point2D dim, boolean logx,
                boolean logy, ArrayList<Double>... lists)
{
    g2.setColor(Color.WHITE);
    g2.fillRect((int) start.getX(), (int) start.getY(), (int) dim.getX(), (int) dim
                    .getY());
    g2.setColor(Color.BLACK);
    g2.drawRect((int) start.getX(), (int) start.getY(), (int) dim.getX(), (int) dim
                    .getY());
    if (lists.length <= 0) return;
    if (lists[0].size() <= 1) return;
    synchronized (drawMonitor)
    {
        double max = Double.NEGATIVE_INFINITY;// 2.0/(Mode.teamNb+1);//Double.NEGATIVE_INFINITY;
        double min = Double.POSITIVE_INFINITY;
        final int PODEOCI = 10;
        for (ArrayList<Double> list : lists)
            for (double d : list)
            {
                max = Math.max(max, d);
                min = Math.min(min, d);
            }
        g2.translate(start.getX(), start.getY());
        Path2D[] paths = new Path2D[lists.length];
        for (int i = 0; i < lists.length; i++)
            paths[i] = new Path2D.Double();
        int maxxx = (true | !logx) ? lists[0].size() : Math.max(16, Integer
                        .highestOneBit(lists[0].size()) << 1);
        double dx = dim.getX() / scaleX(maxxx, 1, logx);
        double dy = dim.getY()
                        / (scaleY(max, 1, min, logy) - scaleY(min, 1, min, logy));
        // pochetak X
        g2.drawString("0", 0, (int) (1.04 * dim.getY()));
        // podeoci X
        if (logx)
        {
            g2.setStroke(dashed);
            for (int i = 10; i * 1.1 < maxxx; i *= 10)
            {
                int pozx = (int) scaleX(i, dx, logx);
                g2.drawString(i + "", pozx - 10, (int) (1.04 * dim.getY()));
                g2.drawLine(pozx, 0, pozx, (int) dim.getY());
            }
            for (int i = 20; i * 1.1 < maxxx; i *= 10)
            {
                int pozx = (int) scaleX(i, dx, logx);
                g2.drawString(i + "", pozx - 10, (int) (1.04 * dim.getY()));
                g2.drawLine(pozx, 0, pozx, (int) dim.getY());
            }
            for (int i = 5; i * 1.1 < maxxx; i *= 10)
            {
                int pozx = (int) scaleX(i, dx, logx);
                g2.drawString(i + "", pozx - 10, (int) (1.04 * dim.getY()));
                g2.drawLine(pozx, 0, pozx, (int) dim.getY());
            }
            g2.setStroke(line);
        } else
        {
            for (int i = 1; i < PODEOCI; i++)
                g2.drawString(i * maxxx / PODEOCI + "", (int) scaleX(i
                                * maxxx / PODEOCI, dx, logx),
                                (int) (1.04 * dim.getY()));
        }
        // kraj X
        g2.drawString(maxxx + "", (int) (0.98 * dim.getX()), (int) (1.04 * dim
                        .getY()));
        // ------------------
        // pochetak Y
        g2.drawString(String.format("%5.3f", -min), -50, (int) (0.01 * dim.getY()));
        // podeoci Y
        for (int i = 1; i < PODEOCI; i++)
            g2.drawString(String.format("%5.3f", (-min + i * (-max + min)
                            / PODEOCI)), -50, (int) scaleY((min + (max - min)
                            * i / PODEOCI), dy, min, logy));
        // kraj Y
        g2.drawString(String.format("%5.3f", -max), -50, (int) (0.99 * dim.getY()));
        for (int i = 0; i < lists.length; i++)
            paths[i].moveTo(scaleX(0, dx, logx), scaleY(lists[i].get(0), dy,
                            min, logy));
        int step = Math.max(1, Integer.highestOneBit(lists[0].size()) >> 8);
        for (int k = 0; k < lists.length; k++)
            for (int i = 1; i < lists[k].size(); i += (i > 128) ? step : 1)
                paths[k].lineTo(scaleX(i, dx, logx), scaleY(
                                lists[k].get(i), dy, min, logy));
        for (int k = lists.length - 1; k >= 0; k--)
        {
            g2.setColor(colors[k]);
            g2.draw(paths[k]);
        }
        g2.translate(-start.getX(), -start.getY());
        // System.out.println(min + " " + max);
    }
}

public static final Color[] colors = new Color[] { Color.BLUE, Color.RED,
                new Color(100, 100, 100), new Color(0, 170, 0), Color.PINK };

private static double scaleX(double x, double dx, boolean logx)
{
    return logx ? scaleLogShift(x, dx, 10) : scaleLin(x, dx);
}

private static double scaleY(double y, double dy, double min, boolean logy)
{
    return logy ? scaleLogShift(y, dy, 10) : scaleLin(y - min, dy);
}

private static double scaleLog(double v, double dv)
{
    return Math.log(v + 1) * dv;
}

private static double scaleLogShift(double v, double dv, double shift)
{
    return (Math.log(v + 1 + shift) - Math.log(shift + 1)) * dv;
}

private static double scaleLin(double v, double dv)
{
    return v * dv;
}
}

这是一个非常古老的代码(在大学时代),但它的工作方式非常简洁

GWT小部件可能适合您的需要。特别是,您可以修改以满足您的需求。

您可以尝试使用该库在GWT中构建图表。对我来说,它比Google Charts API更简单,它提供了构建XY图表的多种可能性。

支持多种图表类型(http://g.raphaeljs.com/). 还可以让您非常轻松地绘制所需的任何基于矢量的图形。它基于SVG和IEI上的VML,我不熟悉GWT中任何通用的
面板
类,它们可以让你做这些事情-你确定这与GWT问题有关吗?嗯,事实上不,一点也不。看起来我把它和AWT搞混了。我的错。但无论如何,它只需要一个图形对象和尽可能多的数组列表就可以了。不幸的是,GWT只需要将Java编译成跨浏览器的JavaScript,它不能影响像素,但必须使用HTML元素,因此图形对象没有直接的等价物。可能(在支持它的浏览器中…)可以使用画布和您表达的基本想法,但它会将这个答案变成更模糊的提示;-)。如果您的图形很简单,您可以使用图形绘制。有关某些GWT图表/绘图库的概述,请参见
  @Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setBackground(Color.WHITE);

    GraficPainter.drawGrafic(g2, new Point2D.Double(800, 50), new Point2D.Double(300, 400), false, false, freal,findiv);        

    if (end) {                  
        simulacija.repaint();
    }
}