2

为什么我不能引用?你知道如何解决吗?我想用 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);
    // }
}
4

4 回答 4

2

制作licz方法static。您在没有实例的情况下调用它。此外 - 您有依赖于方法参数的实例变量 - 这不是直接可能的。也将它们移动到方法体中。

一般来说,您有两种选择:

  • 拥有一切static- 如果您不需要具有某种状态的对象,并且每次调用都是对某些给定参数的一次性操作,那么这是正确的方法。我认为这是你的情况。

  • 有一个实例。使用您希望在整个调用过程中重用的一组给定参数构造它。然后声明非静态方法并决定哪些变量应该属于该实例。

于 2011-04-10T07:35:11.843 回答
0

该方法DDA2.licz()未声明为静态的,因为它使用的 DDA2 类字段也不是静态的。因此,它只能应用于 的实例,DDA2但不能应用于静态上下文(即类似的东西DDA2 d = new DDA2(); d.licz(...);可以工作但不能DDA2.licz(...);)。

于 2011-04-10T07:35:42.747 回答
0

您需要实例化 DDA2 并在该类的新实例上调用 licz。您几乎将正确的代码注释掉了。

替换DDA2.licz(x1, x2, y1, y2)

DDA2 nowy = new DDA2();
nowy.licz(x1, x2, y1, y2);

编辑:完全错过了 DDA2 的损坏定义。@Bozho 的答案是正确的。

于 2011-04-10T07:37:22.437 回答
0

在这种情况下,DAA2 是一个内部类。所以你不能让它的方法是静态的。您应该将 DDA2 类设为静态,然后将 licz 方法设为静态。

或者

将 DAA2 类移出 Test 类并以这种方式使用:

DAA2 daa2 = new DAA2();
daa2.licz(x1, x2, y1, y2);
于 2011-04-10T07:38:02.607 回答