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。インスタンスなしで呼び出しています。さらに、メソッドパラメータに依存するインスタンス変数があります。これは直接不可能です。それらもメソッド本体に移動します。

一般的に、2つのオプションがあります。

  • すべてを持っているstatic-何らかの状態を持つオブジェクトを必要とせず、各呼び出しが特定のパラメーターに対する1回限りの操作である場合、これが適切な方法です。これはあなたの場合だと思います。

  • インスタンスがあります。呼び出し全体で再利用する特定のパラメーターのセットを使用して構築します。次に、メソッドを非静的として宣言し、インスタンスに属する変数を決定します。

于 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 に答える