开发者

non-static method from static context

开发者 https://www.devze.com 2023-02-23 15:42 出处:网络
Why I cannot reffer? Do You know how to fix it? I would like to draw line by DDA algorithm. Please help.

Why I cannot reffer? Do You know how to fix it? I would like to draw line by DDA algorithm. Please help.

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(Gr开发者_如何学Pythonaphics g){
        // super.paintComponent(g);
        // g.setColor(Color.RED);
        // g.fillRect((int) x, (int) y, 1, 1);
    // }
}


Make the licz method static. You are calling it without an instance. Furthermore - you have instance variables that depend on method parameters - this is not directly possible. Move them in the method body as well.

Generally speaking, you have two options:

  • have everything static - if you don't require your an object that has some state, and each invocation is a one-time operation on some given parameters, then this is the proper way to go. I think this is your case.

  • have an instance. Construct it with a given set of parameters that you want to reuse throughout invocations. Then declare the methods non-static and decide which variables should belong to the instance.


The method DDA2.licz() is not declared static since it uses fields of class DDA2 which are not static also. Thus it can only be applied to an instance of DDA2 but not in a static context (i.e. something like DDA2 d = new DDA2(); d.licz(...); will work but not DDA2.licz(...);).


You need to instantiate DDA2 and call licz on the new instance of that class. You nearly have the correct code commented out.

Replace DDA2.licz(x1, x2, y1, y2) with

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

Edit: Missed the broken definition of DDA2 altogether. @Bozho's answer is the correct one.


In this case, the DAA2 is an inner class. So you can't made it's methods static. You should make DDA2 class static and then made the licz method static.

or

Move DAA2 class out of Test class and the use this way :

DAA2 daa2 = new DAA2();
daa2.licz(x1, x2, y1, y2);
0

精彩评论

暂无评论...
验证码 换一张
取 消