Как нарисовать круг в JFrame без переопределения paint (...) или paintComponent (...) - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу нарисовать круг, используя метод, который я создаю, но я получаю исключение nullPointerException

public class GenealogyTreeGUI extends JFrame {
JFrame frame;
Graphics2D g2;

public GenealogyTreeGUI(){
    frame = new JFrame("Genealoy Tree");
    JPanel panel = new JPanel();
    frame.add(panel);
    frame.setVisible(true);
    panel.setVisible(true);

}

это мой метод

 public void drawPerson(int x, int y, Person p1){
    System.out.println("----------------------DrawPerson---------------------------------");
    this.g2.drawOval(x, y, frame.getWidth()/12 , frame.getHeight()/12 );
}

1 Ответ

2 голосов
/ 15 апреля 2020

Вы можете:

  1. Создать BufferedImage нужного размера
  2. Получить свой объект Graphics через createGraphics() (для объекта Graphics2D) или getGraphics() (для Graphics объект)
  3. Нарисуйте с помощью вышеуказанного графического объекта, а затем .dispose() it
  4. Создайте ImageIcon, используя вышеуказанное изображение, с помощью new ImageIcon(myImage)
  5. Отображение значка в JLabel через .setIcon(myIcon)

сделано

enter image description here

например,

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class SomeDrawingFoo extends JPanel {
    private static final int IMG_W = 400;
    private static final int IMG_H = IMG_W;
    private static final Color COLOR_1 = Color.RED;
    private static final Color COLOR_2 = Color.BLUE;
    private static final float DELTA = 40f;
    private JLabel label = new JLabel();

    public SomeDrawingFoo() {

        // create image and draw with it
        BufferedImage myImage = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);       
        Graphics2D g2 = myImage.createGraphics();
        Paint gradPaint = new GradientPaint(0, 0, COLOR_1, DELTA, DELTA, COLOR_2, true);
        g2.setPaint(gradPaint);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.fillOval(10, 10, IMG_W - 20, IMG_H - 20);        
        g2.dispose();

        // put image into Icon and then into JLabel
        Icon myIcon = new ImageIcon(myImage);
        label.setIcon(myIcon);
        add(label);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()-> {
            JFrame frame = new JFrame("Foo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new SomeDrawingFoo());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

}

Примечания :

  • Вы также можете вызвать .getGraphics() на вашем JPanel или JFrame, но полученный объект не будет стабильным или продолжительным, и это приведет к исчезновению изображений или возникновению исключения NullPointerException. Я совершенно определенно рекомендую НЕ рекомендовать этот
  • Обычно самый простой способ сделать вашу графику - это способ, который вы заявили, что не хотели делать - - рисовать по методу JPanel protected void paintComponent(Graphics g).
...