Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Рисование на JPanel


Автор: SID_M 20.5.2006, 10:08
Проблема рисования на ЯПанельке!
Перерисовка должна осуществляться по нажатию кнопки мышки и добавляться дополнительные компоненты, но
метод JPanel.getGraphics() возвращает null

Вот тело процедурки рисования:
Код

 public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        Graphics2D gr2d = (Graphics2D) g;
        
        gr2d.setPaint(Color.BLACK);
        for (int i=0; i<graphObjects.size(); i++){
            MyRect rect = graphObjects.elementAt(i); // graphObjects - вектор фигурок, которые надо рисовать... Пока -это разные прямоугольники
            gr2d.drawRect(rect.getXl(), rect.getYl(), rect.getRECT_LENGTH(),
                    rect.getRECT_HEIGTH());
            gr2d.drawRect(rect.getXr(), rect.getYr(), rect.getDOP_RECT_LENG(), rect.getRECT_HEIGTH());
            gr2d.drawString("?", rect.getXt(), rect.getYt());
            System.out.println("Нарисовали фигурку X:"+rect.getXl()+" Y:"+rect.getYl());
        }        
    }


Вот тело обработчика клацанья мышки:
Код

 private void formMouseReleased(java.awt.event.MouseEvent evt) {                                   
        try {
            MyRect newRect = new MyRect(evt.getX(), evt.getY());
            graphObjects.addElement(newRect);
            Graphics gr = this.getGraphics(); // ТУТ вот и возникает проблема!!!
            this.paintComponent(gr);
        }catch (NullPointerException npe){
            JOptionPane.showMessageDialog(this, "Ошибка с передачей Graphics!");
        }
    }  
 

Автор: LSD 20.5.2006, 12:31
getGraphics() - возвращает null если компонент не отображается: или он не находится в каком нибудь контейнере, или окно не было еще показано на экране.

Вообще не следует вызывать paintComponent(gr), т.к. при перерисовке компонента изображение будет утеряно. Надо изменить состояние отрисовываемого компонента, так чтобы он был готов отрисовывать нужную картинку и вызвать метод repaint(). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)