Java Swing图形在My Line算法中不起作用?
我正试图利用swing图形来衡量Bresenham的算法和不太完美的解决方案(我还没有实现计时器)。就目前情况而言,编译时没有错误,它在basic、drawthoselines和main中抛出NullPointer异常。其思想是,这些行将出现在JFrame中,但它们不会出现。这只是一个空白框。我知道我已将所有内容设置为静态,但在其他方面我会出现很多错误 我是个新手,如果有人能提供解决方案和解释,我将不胜感激Java Swing图形在My Line算法中不起作用?,java,algorithm,swing,line,draw,Java,Algorithm,Swing,Line,Draw,我正试图利用swing图形来衡量Bresenham的算法和不太完美的解决方案(我还没有实现计时器)。就目前情况而言,编译时没有错误,它在basic、drawthoselines和main中抛出NullPointer异常。其思想是,这些行将出现在JFrame中,但它们不会出现。这只是一个空白框。我知道我已将所有内容设置为静态,但在其他方面我会出现很多错误 我是个新手,如果有人能提供解决方案和解释,我将不胜感激 import java.awt.*; import javax.swing.*; pu
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);
}
}
import java.awt.*;
导入javax.swing.*;
公共类行扩展了JPanel{
静态税收;
静态内特三角洲;
静态int-DY2;
静态int-DX2;
静态int-Di;
公共静态void main(字符串[]args){
JFrame f=新的JFrame(“线对线”);
f、 包装();
f、 setVisible(真);
f、 设置大小(300300);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p=新的JPanel();
f、 getContentPane().add(p);
图形g=空;
抽油杆(g);
}
公共静态void basic(int-x1、int-y1、int-x2、int-y2、图形g){
int deltaX=x2-x1;
int deltaY=y2-y1;
浮动m=(浮动)deltaY/(浮动)deltaX;
浮点数c=y1-(m*x1);
对于(int x=x1;x,这不是自定义绘制的方式。请阅读上的Swing教程,以了解绘制工作原理和工作示例
此外,每当您看到所有静态变量和方法时,您就知道自己做错了其他事情。我建议您也花点时间阅读本教程的其他部分,因为它们都包含了一些关于更好地构造代码的示例。您不会实例化图形,因为它是从java.awt.event传递下来的
此外,还有一个扩展了JPanel的类,这意味着您希望通过实例化该类将该类添加到JFrame中。此外,该类将隐式调用paintComponent方法,您将重写该方法以利用图形g。需要了解的内容很多,所以请慢慢来(从基本示例开始)
我还要告诉你们一些关于静态修饰符的事情。
静态修饰符在加载类时运行。因此,如果不是静态的方法在静态方法中,则需要通过实例化包含该方法的对象来调用该方法。因为需要加载对象(类)才能使用该方法
以下内容应该有效:
导入java.awt。;
导入javax.swing
公共类行扩展了JPanel{
静态税收;
静态内特三角洲;
静态int-DY2;
静态int-DX2;
静态int-Di;
公共静态void main(字符串[]args){
JFrame f=新的JFrame(“线对线”);
f、 包装();
f、 setVisible(真);
f、 设置大小(300300);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
第h行=新行();
f、 getContentPane().add(h);
}
公共静态void basic(int-x1、int-y1、int-x2、int-y2、图形g){
int deltaX=x2-x1;
int deltaY=y2-y1;
浮动m=(浮动)deltaY/(浮动)deltaX;
浮点数c=y1-(m*x1);
对于(int x=x1;xWellGraphics g=null;drawthoselines(g);
看起来可能有问题。从基本示例开始).
-这不是一个好的开始示例。如前所述,本教程将解释正确结构的类的基础知识,这些类不使用静态变量和方法。
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);
}
}