Рисование в Java с использованием Canvas - PullRequest
13 голосов
/ 08 марта 2012

Я хочу нарисовать в Java Canvas, но не могу заставить его работать, потому что я не знаю, что я делаю. Вот мой простой код:

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;

public class Program
{
    public static void main(String[] args)
    {
        JFrame frmMain = new JFrame();
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setSize(400, 400);

        Canvas cnvs = new Canvas();
        cnvs.setSize(400, 400);

        frmMain.add(cnvs);
        frmMain.setVisible(true);

        Graphics g = cnvs.getGraphics();
        g.setColor(new Color(255, 0, 0));
        g.drawString("Hello", 200, 200);
    }
}

В окне ничего не появляется.

Не ошибаюсь ли я, что Canvas - это бумага, а Graphics - мой карандаш? Это так работает?

Ответы [ 4 ]

36 голосов
/ 08 марта 2012

Предложения:

  • Не используйте Canvas, так как не нужно смешивать AWT с компонентами Swing без необходимости.
  • Вместо этого используйте JPanel или JComponent.
  • Не получайте ваш объект Graphics, вызвав getGraphics() для компонента, так как полученный объект Graphics будет временным.
  • Drawв методе JPanel paintComponent().
  • Все это хорошо объясняется в нескольких уроках, которые легко найти.Почему бы не прочитать их сначала, прежде чем пытаться угадать эти вещи?

Основные учебные ссылки:

7 голосов
/ 08 марта 2012

Вы должны переопределить метод paint(Graphics g) вашего Canvas и выполнить там свой рисунок. См. документацию по paint ().

Как говорится, операция по умолчанию - очистка холста, поэтому ваш вызов графического объекта холста не выполняется так, как вы ожидаете.

1 голос
/ 06 июня 2016

Должно работать следующее:

public static void main(String[] args)
{
    final String title = "Test Window";
    final int width = 1200;
    final int height = width / 16 * 9;

    //Creating the frame.
    JFrame frame = new JFrame(title);

    frame.setSize(width, height);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);

    //Creating the canvas.
    Canvas canvas = new Canvas();

    canvas.setSize(width, height);
    canvas.setBackground(Color.BLACK);
    canvas.setVisible(true);
    canvas.setFocusable(false);


    //Putting it all together.
    frame.add(canvas);

    canvas.createBufferStrategy(3);

    boolean running = true;

    BufferStrategy bufferStrategy;
    Graphics graphics;

    while (running) {
        bufferStrategy = canvas.getBufferStrategy();
        graphics = bufferStrategy.getDrawGraphics();
        graphics.clearRect(0, 0, width, height);

        graphics.setColor(Color.GREEN);
        graphics.drawString("This is some text placed in the top left corner.", 5, 15);

        bufferStrategy.show();
        graphics.dispose();
    }
}
1 голос
/ 06 сентября 2013

Почему первый способ не работает.Создается объект Canvas, устанавливается размер и графические элементы.Я всегда нахожу это странным.Также, если класс расширяет JComponent, вы можете переопределить

paintComponent(){
  super...
}

, и тогда вы не сможете создать экземпляр этого класса внутри другого класса, а затем просто вызвать NewlycreateinstanceOfAnyClass.repaint();

Я попробовал этот подход для некоторых игровых программ, над которыми я работал, и, похоже, он не работает так, как я думаю.

Дуг Хауф

...