静态上下文中的非静态方法

时间:2011-04-10 07:29:22

标签: java paintcomponent

为什么我不能拒绝?你知道怎么解决吗?我想通过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 个答案:

答案 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);