繁体   English   中英

如何将制作的图形保存为图像而不是在 jpanel 中显示?

[英]how to save a made graph as image instead of showing in jpanel?

通过下面的代码,制作了一个图表并将其添加到另一个 class 中的JPanel中,其中包含一个显示长图(通常具有 3000 宽度)的条:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;

public class Gf extends JPanel {
  private static final long serialVersionUID = 1L;
  private int padding = 0;
  private int labelPadding = 0;
  private Color pointColor = new Color(0, 10, 100);
  private int pointWidth = 1;
  private int numberYDivisions = 2;
  private List<Double> scores;

  public Gf(List<Double> scores) {
    this.scores = scores;
  }

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    double xScale = ((double) getWidth() - (2 * padding) - labelPadding)
        / (scores.size() - 1);
    double yScale = ((double) getHeight() - 2 * padding - labelPadding) / 60000;

    List<Point> graphPoints = new ArrayList<>();
    for (int i = 0; i < scores.size(); i++) {
      int x1 = (int) (i * xScale + padding + labelPadding);
      int y1 = (int) ((getMaxScore() - scores.get(i)) * yScale + padding);
      graphPoints.add(new Point(x1, y1));
    }

    // draw white background
    g2.setColor(Color.BLACK);
    g2.fillRect(padding + labelPadding, padding,
        getWidth() - (2 * padding) - labelPadding,
        getHeight() - 2 * padding - labelPadding);
    g2.setColor(Color.BLACK);

    // create hatch marks and grid lines for y axis.
    for (int i = 0; i < numberYDivisions + 1; i++) {
      int x0 = padding + labelPadding;
      int x1 = pointWidth + padding + labelPadding;
      int y0 = getHeight()
          - ((i * (getHeight() - padding * 2 - labelPadding)) / numberYDivisions
              + padding + labelPadding);
      int y1 = y0;
      if (scores.size() > 0) {
        String yLabel = ((int) ((getMinScore()
                                    + (getMaxScore() - getMinScore())
                                        * ((i * 1.0) / numberYDivisions))
                            * 100))
                / 100.0
            + "";
        FontMetrics metrics = g2.getFontMetrics();
        int labelWidth = metrics.stringWidth(yLabel);
        g2.drawString(
            yLabel, x0 - labelWidth - 5, y0 + (metrics.getHeight() / 2) - 3);
      }
      g2.drawLine(x0, y0, x1, y1);
    }

    // and for x axis
    for (int i = 0; i < scores.size(); i++) {
      if (scores.size() > 1) {
        int x0 =
            i * (getWidth() - padding * 2 - labelPadding) / (scores.size() - 1)
            + padding + labelPadding;
        int x1 = x0;
        int y0 = getHeight() - padding - labelPadding;
        int y1 = y0 - pointWidth;
        if ((i % ((int) ((scores.size() / 20.0)) + 1)) == 0) {
          String xLabel = i + "";
          FontMetrics metrics = g2.getFontMetrics();
          int labelWidth = metrics.stringWidth(xLabel);
          g2.drawString(
              xLabel, x0 - labelWidth / 2, y0 + metrics.getHeight() + 3);
        }
        g2.drawLine(x0, y0, x1, y1);
      }
    }

    // create x and y axes
    g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding,
        padding + labelPadding, padding);
    g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding,
        getWidth() - padding, getHeight() - padding - labelPadding);

    Stroke oldStroke = g2.getStroke();

    g2.setStroke(oldStroke);
    g2.setColor(pointColor);
    for (int i = 0; i < graphPoints.size(); i++) {
      int x = graphPoints.get(i).x - pointWidth / 2;
      int y = graphPoints.get(i).y - pointWidth / 2;
      int ovalW = pointWidth;
      int ovalH = pointWidth;
      g2.fillOval(x, y, ovalW, ovalH);
    }
  }

  //    @Override
  //    public Dimension getPreferredSize() {
  //        return new Dimension(width, heigth);
  //    }
  private double getMinScore() {
    double minScore = -30000;
    return minScore;
  }

  private double getMaxScore() {
    double maxScore = 30000;
    return maxScore;
  }

  public void setScores(List<Double> scores) {
    this.scores = scores;
    invalidate();
    this.repaint();
  }

  public List<Double> getScores() {
    return scores;
  }

  public static void createAndShowGui() {
    List<Double> scores = new ArrayList<>();
    short[] x = mainclass.Omega; // getting required data from main class
    for (int i = 0; i < x.length; i++) {
      scores.add((double) x[i]);
    }
    Gf mainPanel = new Gf(scores);
    mainPanel.setPreferredSize(new Dimension(
        mainclass.range, 276)); // range is calculated at main class and usually
                                // has more than 3k width
    mainclass.p.add(mainPanel); // adding to jpanel at main class
    mainclass.f.revalidate();
    mainclass.f.repaint();
  }
}

问题是,当滚动条以检查整个图表时,有时在速度较慢的设备上会变得很慢。

所以想知道是否有办法将图形保存为图像而不是在JPanel上显示(以便以后可以以某种不影响性能的方式将其添加到JPanel )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM