Как передать в Canvas Graphics

Пытаюсь сделать так, но он выдает что то не понятное

Graphics g = c.getGraphics();
g.drawRect(0, 0, 50, 50);
c.paint();

Вот такую ошибку

Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (default-cli) on project JavaDRaw: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Делал это, и оно работает, но как-то криво хотелось бы напрямую взаимодействовать с Graphics g

Canvas c = new Canvas(){
        @Override
        public void paint(Graphics g){
          g.drawLine(10, 10, 180, 180);
          g.setColor(Color.BLUE);
          g.drawOval(50, 50, 30, 30);  
        }
    };

Вот весь код

public class JavaDrawing{
    static Canvas c = new Canvas();
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Graphics g = c.getGraphics();
        g.create();
        g.drawRect(0, 0, 50, 50);
        c.paint(); 
        frame.add(c);
        frame.setVisible(true); 
    }
 }

Ответы (1 шт):

Автор решения: doodocina

Для начала Вам следует использовать JPanel т.к. вы используете JFrame который относиться к пакету javax.swing, а Canvas к java.awt. Если хотите использовать Canvas то возьмите вместо JFrame обычный Frame или Window.

Код для JFrame и JPanel:

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main
{
    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        Panel p = new Panel();
        
        f.setSize(640, 480);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(p);
        f.setVisible(true);
    }
}

class Panel extends JPanel
{
    @Override
    public void paintComponent(Graphics g)
    {
        g.fillRect(0, 0, 100, 100);
    }
}

Или сокращенный вариант в "вашем стиле":

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main
{
    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        JPanel p = new JPanel()
        {
            @Override
            public void paintComponent(Graphics g)
            {
                g.fillRect(0, 0, 100, 100);
            }
        };
        
        f.setSize(640, 480);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(p);
        f.setVisible(true);
    }
}
→ Ссылка