Создать изображение из Jframe - PullRequest
0 голосов
/ 04 октября 2019

Я создал круговую диаграмму, используя JFrame и качели. Но я хочу преобразовать круговую диаграмму в изображение и сохранить в настольном / локальном пути. Но не имея представления о том, как создать изображение с помощью JFrame Pie.

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Main1 {
  double value;
  Color color;


  public Main1(double value, Color color) {
    this.value = value;
    this.color = color;
  }
}

class MyComponent extends JComponent {
    Main1[] slices = { new Main1(1, Color.black), new Main1(1, Color.green),
      new Main1(1, Color.yellow), new Main1(1, Color.red) };

  MyComponent() {

  }
  public void paint(Graphics g) {
    drawPie((Graphics2D) g, getBounds(), slices);
  }

  void drawPie(Graphics2D g, Rectangle area, Main1[] slices) {
    double total = 0.0D;
    for (int i = 0; i < slices.length; i++) {
      total += slices[i].value;
    }

    double curValue = 0.0D;
    int startAngle = 0;
    for (int i = 0; i < slices.length; i++) {
      startAngle = (int) (curValue * 360 / total);
      int arcAngle = (int) (slices[i].value * 360 / total);

      g.setColor(slices[i].color);
      g.fillArc(area.x, area.y, area.width, area.height, startAngle, arcAngle);
      curValue += slices[i].value;
    }
  }
}

public class Main2 {
     public JPanel contentPane;
  public static void main(String[] argv) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new MyComponent());
    frame.setSize(300, 200);
    frame.setVisible(true);   
  }

}

Ответы [ 2 ]

3 голосов
/ 04 октября 2019

Основная логика для создания компонента Image: Swing:

Dimension d = component.getSize();
BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
component.print( g2d );
g2d.dispose();
ImageIO.write(image, ".jpg", new File(...));

Вы также можете проверить класс Screen Image для удобства методов, которые рисуют весь кадр,Компонент на рамке или прямоугольник компонента на рамке.

Обратите внимание, что в приведенном выше предложении предполагается, что вы выполняете пользовательскую раскраску правильно, что означает, что вы:

  1. растянуть JPanel
  2. переопределить paintComponent(...), а не рисовать (...)
  3. invoke super.paintComponent(...)

Если вы хотите расширить JComponent, вам необходимо:

  1. override paintComponent (...);
  2. сначала заполните фон вашего компонента, прежде чем вызывать метод drawPie (...)
1 голос
/ 04 октября 2019

Но я хочу преобразовать круговую диаграмму в изображение

Создайте BufferedImage и раскрасьте его

BufferedImage bi = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
new MyComponent().drawPie(g2d, new Rectangle(0, 0, 200, 200), slices);
g2d.dispose();

и сохраните врабочий стол / локальный путь

Использование ImageIO

ImageIO.write(bi, "jpg", new File("the/path/andName.jpg"));
...