为什么我不能拒绝?你知道怎么解决吗?我想通过DDA算法绘制线条。 请帮忙。
import java.awt.*;
import java.awt.event.*;
import java.lang.String.*;
import java.util.Scanner;
import java.io.IOException;
import javax.swing.*;
class Test extends JPanel {
private void JPanel1MouseClicked(MouseEvent evt){
int x = evt.getX();
int y = evt.getY();
System.out.println("X to: " + x + " Y to: " + y);
}
public void sprawdz(double xx1, double xx2, double yy1, double yy2){
}
public static void main(String[] args) {
String x1;
String x2;
String y1;
String y2;
Scanner sc = new Scanner(System.in);
System.out.print("Podaj pierwsza wspolrzedna pierwszego punktu: ");
x1 = sc.nextLine();
System.out.print("Podaj druga wspolrzedna pierwszego punktu: ");
x2 = sc.nextLine();
System.out.print("Podaj pierwsza wspolrzedna drugiego punktu: ");
y1 = sc.nextLine();
System.out.print("Podaj druga wspolrzedna drugiego punktu: ");
y2 = sc.nextLine();
//DDA2 nowy = new DDA2(x1, x2, y1, y2);
Test nowy = new Test();
DDA2.licz(x1, x2, y1, y2);
JFrame ramka = new JFrame();
ramka.setSize(300,300);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().add(new Test());
ramka.setVisible(true);
// JPanel jp = new JPanel();
// jp.setBackground(Color.WHITE);
// jp.setSize(100,100);
// jp.setLayout(new BorderLayout());
// jp.setVisible(true);
}
class DDA2 {
double dxx1 = Double.parseDouble(xx1);
double dxx2 = Double.parseDouble(xx2);
double dyy1 = Double.parseDouble(yy1);
double dyy2 = Double.parseDouble(yy2);
double dx = x2 - x1;
double dy = y2 - y1;
public void licz(String xx1, String xx2, String yy1, String yy2){
if (Math.abs(dx) >= Math.abs(dy))
{
double m = Math.abs(dx);
System.out.println("DX" + m);
}
else
{
// ALGORYTYM PRZYROSTOWY
double m = Math.abs(dy);
//System.out.println("DY" + m);
double x = dxx1;
double y = dyy1;
for (int i=1; i <= m; i++)
{
x = x + dx/m;
y = y + dy/m;
}
}
System.out.println("Wspolrzednie punktu pierwszego to: " + "(" + dxx1 + "; " + dxx2 +")");
System.out.println("Wspolrzednie punktu drugiego to: " + "(" + dyy1 + "; " + dyy2 + ")");
}
}
// public void paintComponent(Graphics g){
// super.paintComponent(g);
// g.setColor(Color.RED);
// g.fillRect((int) x, (int) y, 1, 1);
// }
}
答案 0 :(得分:2)
制作licz
方法static
。你在没有实例的情况下调用它。此外 - 您有实例变量依赖于方法参数 - 这不是直接可能的。也可以在方法体中移动它们。
一般来说,您有两种选择:
拥有所有内容static
- 如果您不需要具有某种状态的对象,并且每次调用都是对某些给定参数的一次性操作,那么这是正确的方法。我认为这是你的情况。
有一个实例。使用您希望在整个调用中重用的一组给定参数构造它。然后声明方法是非静态的,并确定哪些变量应属于该实例。
答案 1 :(得分:0)
方法DDA2.licz()
未声明为静态,因为它使用的类DDA2也不是静态的。因此,它只能应用于DDA2
的实例,但不能应用于静态上下文(例如DDA2 d = new DDA2(); d.licz(...);
之类的内容将起作用,但不适用于DDA2.licz(...);
)。
答案 2 :(得分:0)
您需要实例化DDA2并在该类的新实例上调用licz。你几乎已经注释掉了正确的代码。
将DDA2.licz(x1, x2, y1, y2)
替换为
DDA2 nowy = new DDA2();
nowy.licz(x1, x2, y1, y2);
编辑:完全错过了DDA2的破坏定义。 @ Bozho的回答是正确的。
答案 3 :(得分:0)
在这种情况下,DAA2是一个内部类。 所以你不能让它的方法静态。 你应该使DDA2类静态,然后使licz方法静态。
或
将DAA2类移出Test类并以这种方式使用:
DAA2 daa2 = new DAA2();
daa2.licz(x1, x2, y1, y2);