Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自静态上下文的非静态方法_Java_Paintcomponent - Fatal编程技术网

Java 来自静态上下文的非静态方法

Java 来自静态上下文的非静态方法,java,paintcomponent,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

为什么我不能重新引用?你知道怎么修吗?我想用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);
    // }
}
import java.awt.*;
导入java.awt.event.*;
导入java.lang.String.*;
导入java.util.Scanner;
导入java.io.IOException;
导入javax.swing.*;
类测试扩展了JPanel{
私有void jpanelmouseclicked(MouseEvent evt){
int x=evt.getX();
int y=evt.getY();
System.out.println(“X到:”+X+“Y到:”+Y);
}
公共空间sprawdz(双xx1,双xx2,双yy1,双yy2){
}
公共静态void main(字符串[]args){
字符串x1;
字符串x2;
字符串y1;
字符串y2;
扫描仪sc=新的扫描仪(System.in);
系统输出打印(“Podaj pierwsza wspolrzedna pierwszego punktu:”;
x1=sc.nextLine();
系统输出打印(“Podaj druga wspolrzedna pierwszego punktu:”;
x2=sc.nextLine();
系统输出打印(“Podaj pierwsza wspolrzedna drugiego punktu:”;
y1=sc.nextLine();
系统输出打印(“Podaj druga wspolrzedna drugiego punktu:”;
y2=sc.nextLine();
//现在的DDA2=新的DDA2(x1,x2,y1,y2);
立即测试=新测试();
DDA2.licz(x1,x2,y1,y2);
JFrame ramka=新的JFrame();
ramka.setSize(300300);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().add(新测试());
ramka.setVisible(真);
//JPanel jp=新的JPanel();
//jp.挫折背景(颜色:白色);
//jp.setSize(100100);
//jp.setLayout(新的BorderLayout());
//jp.setVisible(真);
}
DDA2类{
double dxx1=double.parseDouble(xx1);
double dxx2=double.parseDouble(xx2);
double dyy1=double.parseDouble(yy1);
double dyy2=double.parseDouble(yy2);
双dx=x2-x1;
双dy=y2-y1;
公共无效licz(字符串xx1、字符串xx2、字符串yy1、字符串yy2){
if(Math.abs(dx)>=Math.abs(dy))
{
双m=数学绝对值(dx);
系统输出打印项次(“DX”+m);
}
其他的
{
//普兹罗斯托维算法
双m=数学绝对值(dy);
//系统输出打印项次(“DY”+m);
双x=dxx1;
双y=dyy1;

对于(int i=1;i使
licz
方法
static
。您在没有实例的情况下调用它。此外,您有依赖于方法参数的实例变量,这是不可能的。也可以在方法体中移动它们

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

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

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


方法
DDA2.licz()
没有声明为静态的,因为它使用的是类DDA2的字段,这些字段也不是静态的。因此,它只能应用于
DDA2
的实例,而不能应用于静态上下文中(例如
DDA2 d=new DDA2();d.licz(…);
将起作用,但
DDA2.licz(…);
).

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

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

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

编辑:完全忽略了DDA2的错误定义。@Bozho的答案是正确的。

在本例中,DAA2是一个内部类。 所以你不能让它是静态的。 您应该将DDA2类设置为静态,然后将licz方法设置为静态

将DAA2类移出测试类,并使用以下方法:

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

欢迎使用StackOverflow!我已经为您修复了代码格式。在您提问的右侧,有一个方便的“如何设置格式”框。值得一读,就像问题区域上方的[?]一样。