Какой самый простой способ рисовать в Java? - PullRequest
2 голосов
/ 14 марта 2011

Какой самый простой способ рисовать в Java?

import java.awt.*;
import javax.swing.*;

public class Canvas
{
    private JFrame frame;    
    private Graphics2D graphic;
    private JPanel canvas;

    public Canvas()
    {
        frame = new JFrame("A title");
        canvas = new JPanel();
        frame.setContentPane(canvas);
        frame.pack();
        frame.setVisible(true);
    }

    public void paint(Graphics g){
        BufferedImage offImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Grapics2D g2 = offImg.createGraphics();
        g2.setColor(new Color(255,0,0));
        g2.fillRect(10,10,200,50);
    }
}

Это не работает, и я не знаю, как заставить что-либо появляться.

Ответы [ 4 ]

6 голосов
/ 14 марта 2011

Самый простой способ:

public class Canvas extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        // painting code goes here.
    }
}

Вам просто нужно расширить JPanel и переопределить метод paintComponent панели.

Я хотел бы повторить, что вы должны не переопределяет метод paint.

Вот очень минималистичный пример, который работает.

public static void main(String[] args) {
    JFrame f = new JFrame();
    JPanel p = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawLine(0, 0, 100, 100);
        }
    };
    f.add(p);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}
0 голосов
/ 14 марта 2011

jjnguy уже написал, как это сделать правильно ... но вот почему это не работает в вашем примере:

import java.awt.*;
import javax.swing.*;

public class Canvas

Здесь у вас есть класс, который никак не относится к Swing или AWT,(Кстати, вы можете выбрать другое имя, чтобы избежать путаницы с java.awt.Canvas.)

{
    private JFrame frame;    
    private Graphics2D graphic;
    private JPanel canvas;

    public Canvas()
    {
        frame = new JFrame("A title");
        canvas = new JPanel();
        frame.setContentPane(canvas);

Здесь вы создаете новую JPanel (для путаницы также с именем canvas) и добавляете еев кадр.Являются ли методы этой панели paint и paintComponent, которые вызываются, когда система показывает ваш кадр.

        frame.pack();
        frame.setVisible(true);
    }

    public void paint(Graphics g){
        BufferedImage offImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Grapics2D g2 = offImg.createGraphics();
        g2.setColor(new Color(255,0,0));
        g2.fillRect(10,10,200,50);
    }

Этот метод рисования никогда не используется вообще (так как он не является частью компонента),и если он будет вызван, то вы рисуете только для некоторого BufferedImage, а не для экрана.

}
0 голосов
/ 14 марта 2011
// No. 1
// Create a graphics context on the buffered image
Graphics2D g2d = bimage.createGraphics();

// Draw on the buffered image
g2d.setColor(Color.red);
g2d.fill(new Ellipse2D.Float(0, 0, 200, 100));
g2d.dispose();

// No.2
// In case the buffered image supports transparency

g2d = bimage.createGraphics();

// Transparency is created on all the filled pixels
Color transparent = new Color(0, 0, 0, 0);
g2d.setColor(transparent);
g2d.setComposite(AlphaComposite.Src);
g2d.fill(new Rectangle2D.Float(20, 20, 100, 20));
g2d.dispose();
0 голосов
/ 14 марта 2011

Чтобы что-то появилось в рисовании (Графика g), вам нужно вызвать методы рисования (например, fillRect) для этой Графики. Вы создаете растровое изображение и затем рисуете растровое изображение, а не экран.

public void paint(Graphics g){
    g.setColor(new Color(255,0,0));
    g.fillRect(10,10,200,50);
}
...