2013-09-14 2 views
-1

Я пытаюсь использовать графику swing, чтобы измерить алгоритм Брешенема против менее отполированного решения (пока я еще не реализовал таймеры). Как бы то ни было, при компиляции ошибок нет, и он генерирует исключение NullPointer на базовом, drawthoselines и main. Идея состоит в том, что строки появятся в JFrame, но они этого не делают. Это просто пустая рамка. Я знаю, что все настроено на статичность, но в противном случае я получаю много ошибок.Swing Graphics не работает в моем линейном алгоритме?

Я новичок, и я был бы благодарен всем, кто мог бы дать решение и объяснение.

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

public class lines extends JPanel { 

static int deltaX; 
static int deltaY; 
static int DY2; 
static int DX2; 
static int Di; 

public static void main (String[] args) { 
JFrame f = new JFrame("Line vs Line"); 
f.pack(); 
f.setVisible(true); 
f.setSize(300,300); 
f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
JPanel p = new JPanel(); 
f.getContentPane().add(p); 
Graphics g = null; 
drawthoselines(g); 
} 

public static void basic(int x1, int y1, int x2, int y2, Graphics g){ 
int deltaX = x2-x1; 
int deltaY = y2-y1; 
float m = (float)deltaY/(float)deltaX; 
float c = y1 - (m*x1); 
for (int x=x1; x<x2; x++){ 
float floatY = (m*x) + c; 
int y = Math.round(floatY); 
g.drawLine(x,y,x,y); 
} 
} 

public static void brz(int x1, int y1, int x2, int y2, Graphics g){ 
deltaX = x2-x1; 
deltaY = y2-y1; 
DY2 = 2* deltaY; 
DX2 = 2* deltaX; 
Di = DY2 - deltaX; 
int x = x1; 
int y = y1; 
int prevy; 
while (x<x2) { 
x++; 
prevy = y; 
if (Di > 0){ 
y++; 
} 
g.drawLine(x,y,x,y); 
Di = Di + DY2 - (DX2 * (y - prevy)); 
} 
} 

public static void drawthoselines(Graphics g){ 
basic(10,10,40,30,g); 
basic(10,10,40,90,g); 
brz(50,50,150,60,g); 
brz(50,50,150,120,g); 
brz(50,50,150,140,g); 
} 

} 
+2

Well 'Graphics g = null; drawthoselines (g); 'выглядит так * может * быть проблематичным. – Zong

ответ

-1

Вы не создаете экземпляр Graphics, потому что он передается из java.awt.event Также у вас есть класс, который расширяет JPanel, что означает, что вы хотите добавить класс в JFrame, создав экземпляр класса. Кроме того, класс будет неявно вызывать метод paintComponent, который вы переопределите, чтобы использовать графику g. Очень много вещей, которые нужно предпринять, так что идите медленно (начинайте с рудиментарных примеров).

Позвольте мне также сообщить вам немного о статическом модификаторе. Статический модификатор запускается при загрузке класса. Таким образом, если метод, который не является статичным, находится в статическом методе, этот метод необходимо вызвать, создавая экземпляр объекта, который поддерживает этот метод. Потому что вам нужен объект (класс), загруженный, чтобы иметь возможность использовать этот метод.

Ниже следует работать: import java.awt. ; импорт javax.swing.;

public class lines extends JPanel { 

static int deltaX; 
static int deltaY; 
static int DY2; 
static int DX2; 
static int Di; 

public static void main (String[] args) { 
JFrame f = new JFrame("Line vs Line"); 
f.pack(); 
f.setVisible(true); 
f.setSize(300,300); 
f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
lines h = new lines(); 
f.getContentPane().add(h); 

} 

public static void basic(int x1, int y1, int x2, int y2, Graphics g){ 
int deltaX = x2-x1; 
int deltaY = y2-y1; 
float m = (float)deltaY/(float)deltaX; 
float c = y1 - (m*x1); 
for (int x=x1; x<x2; x++){ 
float floatY = (m*x) + c; 
int y = Math.round(floatY); 
g.drawLine(x,y,x,y); 
} 
} 

public static void brz(int x1, int y1, int x2, int y2, Graphics g){ 
deltaX = x2-x1; 
deltaY = y2-y1; 
DY2 = 2* deltaY; 
DX2 = 2* deltaX; 
Di = DY2 - deltaX; 
int x = x1; 
int y = y1; 
int prevy; 
while (x<x2) { 
x++; 
prevy = y; 
if (Di > 0){ 
y++; 
} 
g.drawLine(x,y,x,y); 
Di = Di + DY2 - (DX2 * (y - prevy)); 
} 
} 

public static void drawthoselines(Graphics g){ 

} 
@Override 
protected void paintComponent(Graphics g) { 
basic(10,10,40,30,g); 
basic(10,10,40,90,g); 
brz(50,50,150,60,g); 
brz(50,50,150,120,g); 
brz(50,50,150,140,g); 
} 

} 
+2

'начните с рудиментарных примеров).' - это не лучший пример для начала. Как уже упоминалось, в учебнике объясняются основы правильно структурированных классов, а не статические переменные и методы. – camickr

2

Это не так, как вы делаете обычную картину. Прочтите учебник Swing по телефону Custom Painting для объяснения того, как работают картины и для рабочих примеров.

Кроме того, всякий раз, когда вы видите все статические переменные и метод, вы знаете, что делаете что-то еще неправильно. Я предлагаю вам потратить время, чтобы прочитать другой раздел учебника, так как все они содержат примеры лучшего способа структурирования вашего кода.

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