нестатический метод из статического контекста - PullRequest
2 голосов
/ 10 апреля 2011

Почему я не могу ответить? Вы знаете, как это исправить? Я хотел бы нарисовать линию по алгоритму 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 ]

2 голосов
/ 10 апреля 2011

Сделать метод licz static. Вы называете это без экземпляра. Более того - у вас есть переменные экземпляра, которые зависят от параметров метода - это невозможно напрямую. Переместите их также в тело метода.

Вообще говоря, у вас есть два варианта:

  • есть все static - если вам не требуется, чтобы у вашего объекта было какое-то состояние, и каждый вызов является однократной операцией с некоторыми заданными параметрами, то это правильный путь. Я думаю, что это ваш случай.

  • есть экземпляр. Создайте его с заданным набором параметров, которые вы хотите использовать во всех вызовах. Затем объявите методы нестатичными и решите, какие переменные должны принадлежать экземпляру.

0 голосов
/ 10 апреля 2011

В этом случае DAA2 является внутренним классом.Так что вы не можете сделать его методы статичными.Вы должны сделать класс DDA2 статическим, а затем статический метод licz.

или

Переместить класс DAA2 из класса Test и использовать его следующим образом:

DAA2 daa2 = new DAA2();
daa2.licz(x1, x2, y1, y2);
0 голосов
/ 10 апреля 2011

Вам нужно создать экземпляр DDA2 и вызвать licz для нового экземпляра этого класса.Вы почти закомментировали правильный код.

Замените DDA2.licz(x1, x2, y1, y2) на

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

Редактировать: Пропущено неверное определение DDA2.@ Божо ответ правильный.

0 голосов
/ 10 апреля 2011

Метод DDA2.licz() не объявлен как статический, поскольку он использует поля класса DDA2, которые также не являются статическими.Таким образом, его можно применять только к экземпляру DDA2, но не в статическом контексте (то есть что-то вроде DDA2 d = new DDA2(); d.licz(...); будет работать, но не DDA2.licz(...);).

...