2017-01-04 3 views
-1

Я пытаюсь нарисовать строку на холсте. Ошибка возникает, когда я создаю экземпляр класса, который расширяет Canvas, почему я его получаю?java.lang.StackOverflowError в теме main

стек Ошибка

at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 
at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222) 
at java.awt.Window.init(Window.java:505) 
at java.awt.Window.<init>(Window.java:537) 
at java.awt.Frame.<init>(Frame.java:420) 
at javax.swing.JFrame.<init>(JFrame.java:233) 
at canvas.Canvas.<init>(Canvas.java:20) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas.<init>(Canvas.java:17) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas.<init>(Canvas.java:17) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35) 
at canvas.Canvas.<init>(Canvas.java:17)` 

Вот мой код:

public class Canvas extends JFrame{ 

DrawCanvas cc = new DrawCanvas(); 

public Canvas(){ 
    super("Canvas"); 
    setVisible(true); 
    setSize(100, 100); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    add(cc); 
} 

public static void main(String[] args) { 
    Canvas c = new Canvas(); 
} 

private class DrawCanvas extends Canvas{ 
    @Override 
    public void paint(Graphics g){ 
     g.drawString("String", 10, 10); 
    } 
} 
} 
+1

Почему вы скрываете сам вопрос? как мы можем ответить, если вы полностью не предоставляете stacktrace? – Azodious

+1

Напиши здесь код – AMB

+0

Трассировка стека продолжается на холсте. Canvas $ DrawCanvas. (Canvas.java:35) на холсте.Canvas $ DrawCanvas. (Canvas.java:35) на холсте.Канас. (Canvas.java:17) ' – Filippo

ответ

0

Вот что вы делаете неправильно: Canvas конструктор создает новый DrawCanvas, но DrawCanvas расширяет Canvas и так как вы 'не указывая другого конструктора, он принимает конструктор своего суперкласса (Canvas) и поэтому также делает новый DrawCanvas, что делает еще DrawCanvas ... до бесконечности. Поэтому ваш код:

new DrawCanvas() 

Результаты в бесконечной рекурсии.

Возможно, вы имели в виду удлинение java.awt.Canvas?

Кроме того, вы можете захотеть, чтобы не дать вашим классам похожие названия тем, которые содержатся в API Java, особенно, если вы используете эти так же названные классы.

+0

Спасибо, что я должен изменить, чтобы выполнить метод рисования? – Filippo

+0

@Filippo Ну, я сначала сменил бы имена ваших классов. Вы хотите расширить Java 'Canvas', разве нет? Либо вы можете написать 'extends java.awt.Canvas', либо переименовать свой' JFrame' в нечто вроде MyWIndow'. Потому что я думаю, что вы не собираетесь делать 'Canvas' расширением' JFrame'. – Moira

+0

Теперь он работает, я расширял класс Canvas для моего проекта вместо java.awt.Canvas, Thank – Filippo

Смежные вопросы