2015-04-08 2 views
1

Я хочу практиковать paintComponent метод. Моя программа состоит из двух классов (test и paintClass) в разных файлах. Я хочу разделить область на 25 квадратов, рисуя линии вертикально и горизонтально, используя метод paintComponent. Теперь у моего конструктора есть paintComponent. Я знаю, что это не очень эффективно, но я буду добавлять кнопки, ярлыки и другие вещи в будущем, поэтому мне нужно использовать эту программу, как это. Когда я запускаю программу, я получаю ошибку nullpointerexception. Можете ли вы помочь?Практика paintComponent метод

EDIT: я изменил страницу на g и добавил некоторые строки в код. По-прежнему имеет ту же ошибку.

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

public class test 
{ 

    public static void main(String[] args) 
    { 

     JFrame frame = new JFrame("buttons"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     paintClass paint = new paintClass();//This line has error. 
     paint.repaint();//ADDED 
     frame.add(paint); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 



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

public class paintClass extends JPanel 
{ 
    private Graphics g; 
    private int interval,side,number; 

    public paintClass() 
    { 
     this.repaint();//ADDED 
     paintComponent(g);//This line has error. 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g);//ADDED and has an error. 
     this.repaint();//ADDED 
     side = 250; 
     number = 5; 
     interval = side/number; 
     g.drawRect(0,0, side, side); 

     for(int i = 0; i <= number - 1; i++) 
     { 
      for(int j = 0; j <= number - 1; j++) 
      { 
       g.drawLine(i * interval, 0, i * interval, side); 
      } 
      g.drawLine(0, i * interval, side, i * interval); 
     } 

    } 
} 
+0

'Я хочу практиковать paintComponent method.' - тогда начните с рабочих примеров из учебника Swing в [Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html). Учебник покажет вам лучшую структуру для вашей программы. Все, что вам нужно изменить, это код в методе paintComponent(). – camickr

ответ

2

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

//constructor of Class - note Classnames should start with uppercase 
public paintClass(){ 
    //no need to call paintComponent or repaint here 
} 

Вы можете запросить перерисовку, вызывая метод перекрасить(), определенный JComponent (родительский класс JPanel). Вы должны также вызвать родительский методу

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    //do your custom drawing here, and never call repaint from this method 
} 

Я бы рекомендовал, если вы еще не, чтобы изучить уроки Oracle о пользовательских живописи: http://docs.oracle.com/javase/tutorial/uiswing/painting/

+0

Я продолжаю получать ту же ошибку. – hackerboy

+0

Можете только гадать, какие изменения вы внесли.Вам нужно будет показать нам код (например, обновить свой вопрос с внесенными изменениями) – copeg

+0

Это сработало спасибо. – hackerboy

-2

В классе «paintClass», вы должны создать экземпляр страницы вар:

public paintClass() 
{ 
    page = new Graphics(); 
    paintComponent(page); 
} 
+1

Ошибка: Графика абстрактная; не может быть создан – hackerboy

+1

Класс Graphics является абстрактным. Нужно полагаться на соответствующий графический контекст, в этом случае он передается paintComponent, когда метод вызывается EDT. – copeg

0

Вам нужно Override в paintComponent(Graphics g) не создать. Кроме того, если вы хотите выполнить paintComponent(...), вызовите repaint() на этом компоненте, не вызывайте напрямую paintComponent(...).

+0

Как использовать метод repaint() на paintComponent? – hackerboy

+0

@hackerboy для выполнения 'paintComponent (...)' вы можете сделать это 'paint.repaint()' где 'paint' является экземпляром' paintClass', также вы можете вызвать 'this.repaint()' внутри любого метод 'paintClass'. – Titus

+0

Я продолжаю получать ту же ошибку. – hackerboy

1

Первое правило окраски в Свинге, вы не контролируете процесс окраски. Swing будет рисовать, когда и если захочет. Лучшее, что вы можете сделать, это дать подсказки системе, что вы хотите что-то обновить.

  • Никогда не сохранять ссылку на графики или к вам не создать себе
  • Никогда не называйте repaint прямо или косвенно внутри любого метода краски, это создаст рекурсивные краски цикл, который в конечном итоге потреблять ваш процессор
  • Это бессмысленно называть repaint на компоненте, который не является отображаемым на экране

Например

public class paintClass extends JPanel 
{ 

    private int interval,side,number; 

    public paintClass() 
    { 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 400); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     side = 250; 
     number = 5; 
     interval = side/number; 
     g.drawRect(0,0, side, side); 

     for(int i = 0; i <= number - 1; i++) 
     { 
      for(int j = 0; j <= number - 1; j++) 
      { 
       g.drawLine(i * interval, 0, i * interval, side); 
      } 
      g.drawLine(0, i * interval, side, i * interval); 
     } 

    } 
} 
+0

Я уже исправил проблему, но спасибо за ответ. – hackerboy

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