2013-03-12 2 views
0

Что бы я ни делал, я не могу отображать прямоугольник/линию/овал на экране. Я проверил другие источники, где они рисуют графику, но когда я даже выполняю эти коды, у меня нет графиков, отображаемых в окнах. Ниже приведен пример из учебника.Графика не отображается

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

class PlotGraph 
{ 
    public static void main (String [] args) { 
    JFrame win; 
    Container contentPane; 
    Graphics g; 

    win = new JFrame("testing"); 
    win.setSize(300,200); 
    win.setLocation(100,100); 
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    win.setVisible(true); 

    contentPane = win.getContentPane(); 
    g = contentPane.getGraphics(); 

    g.drawRect(10, 30, 50, 50); 

    } 

} 
+0

Из любопытства, что это за книга? – wchargin

+0

OOP с Java от Thomas WU, 5-е издание. страница 257 – razshan

+0

Я также видел это видео на графике, но у меня была та же проблема с графикой, которая не появилась, но в видео, которое она делает для человека, объясняющего это - http://www.youtube.com/watch?v=2l5-5PMUc5Y&list = PLFE2CE09D83EE3E28 – razshan

ответ

1

Это не то, как графика работает в Swing.

Вам необходимо добавить компонент к вашему кадру, а не просто нарисовать его. Вы никогда не хотите рисовать прямо на раме. Причина, по которой он ничего не делает, заключается в том, что ваш код рисунка переопределяется.

Если вы хотите, чтобы ваш компонент имел собственный код чертежа, создайте подкласс JComponent и переопределите метод paintComponent(Graphics). Пример того, как вы должны сделать это следующим образом:

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

class PlotGraph { 
    public static void main(String[] args) { 
     JFrame win; 

     win = new JFrame("testing"); 
     win.setSize(300, 200); 
     win.setLocation(100, 100); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.setVisible(true); 
     win.setContentPane(new MyComponent()); 
    } 

} 

class MyComponent extends JComponent { 

    @Override 
    public void paintComponent(Graphics g) { 
     g.drawRect(10, 30, 50, 50); 
    } 
} 

Я высоко рекомендуем вам проверить Java GUI tutorial онлайн.

+0

+1 для ссылки на учебник Swing. -1 для добавления компонента после просмотра кадра и не выполнения кода на EDT. – camickr

+0

WChargin - у меня вопрос. Он работает, но как вызывается метод paintComponent? Как и тот объект, который вызывает его. Все, что я вижу, мы создаем новый объект класса MyComponent, который имеет один метод void. Что делать, если у меня было несколько методов? – razshan

+0

Живопись определяется/назначается менеджером перекраски. Скачайте [Psinting in AWT & Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) для более подробного описания – MadProgrammer

3

Ouch. Тогда вы должны изменить свой текст. Прежде всего, все обращения к компонентам Swing должны выполняться в event dispatch thread.

Во-вторых, вы не должны получать графику компонента и рисовать на нем. Вместо этого вы должны расширить JComponent или JPanel, переопределить его метод paintComponent(Graphics) и нарисовать с использованием объекта Graphics, переданного как аргумент (и который фактически является экземпляром Graphics2D).

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