Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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 Repaint()无法对非静态方法进行静态引用?_Java_Parameter Passing_Paint_Repaint - Fatal编程技术网

Java Repaint()无法对非静态方法进行静态引用?

Java Repaint()无法对非静态方法进行静态引用?,java,parameter-passing,paint,repaint,Java,Parameter Passing,Paint,Repaint,我写的一些代码有问题。我试图将Main方法更改为paintComponent方法,但它表示不能对非静态方法进行静态引用。我想我明白它在说什么,但我不知道如何避开这个问题。课程安排如下: import javax.swing.JFrame; import java.awt.Graphics; public class Main extends JFrame{ /** * */ private static final long serialVe

我写的一些代码有问题。我试图将Main方法更改为paintComponent方法,但它表示不能对非静态方法进行静态引用。我想我明白它在说什么,但我不知道如何避开这个问题。课程安排如下:

import javax.swing.JFrame;
import java.awt.Graphics;

public class Main extends JFrame{       
    /**
     * 
     */
    private static final long serialVersionUID = -4511248732627763442L;

    public static void main(String[] args){     

        frame();        
        repaint();      
        move();         
    }

    public static void frame(){

        JFrame frame = new JFrame("Hunter VS Hunted");          
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);          
        frame.setVisible(true);                             
        frame.setResizable(false);                          
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       


    }

    public void paintComponent(Graphics g){

        super.paintComponents(g);   
        Hunter.paint(g);            
        Hunted.paint(g);            


    }

    public static void move(){

        Hunter.move();          
        Hunted.move();                      

    }
}

该类中的Hunter和hunted是两个外部类。错误发生在主方法中,重新绘制时,如有任何建议/指示,将不胜感激

原因是在组件类中,repaint方法是一种非静态方法。您可能需要执行以下操作:

Main myMain = new Main();
myMain.repaint();
或者,如果您打算在通过frame方法创建的jframe上使用它,则可以执行以下操作:

public static JFrame frame(){
    JFrame frame = new JFrame("Hunter VS Hunted");          
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);          
    frame.setVisible(true);                             
    frame.setResizable(false);                          
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
    return frame;
}
 JFrame frame = frame();
 frame.repaint();
在你的主要方法中,你可以这样做:

public static JFrame frame(){
    JFrame frame = new JFrame("Hunter VS Hunted");          
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);          
    frame.setVisible(true);                             
    frame.setResizable(false);                          
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
    return frame;
}
 JFrame frame = frame();
 frame.repaint();

您必须理解静态方法和实例方法之间的区别

静态方法用于执行与特定对象的状态无关的操作。它们可以创建新对象、对给定参数运行操作或操作静态字段

但是,它们只存在于类中,与任何特定对象都不相关

要使用swing,需要创建实际对象—不同的面板、按钮和其他组件。它们中的每一个都是一个对象,同一类中可以有许多对象,许多按钮,许多帧。每个对象的状态决定其行为方式。按下一个按钮可以做一件事,另一个按钮可以做另一件事。一个有这个颜色,另一个有那个颜色,等等

因此,重绘甚至设置动作侦听器等行为并不是应用于整个类的行为,而只是应用于一个特定的对象、按钮、面板等

因此,您的Hunted和Hunter类的行为应该在使用Hunter=new Hunter创建的特定实例的视图中创建。。。and hunted=new hunted,它们的方法应该通过对对象的引用来调用,而不是直接从类中调用,因为这些方法与屏幕上绘制的特定对象的状态相关

我不确定你是否想让Main成为JFrame。但是如果你这样做了,你必须创建一个新的Main并添加任何组件。不只是创建一些JFrame,然后期望paintComponent方法应用于它,因为您将它作为Main的方法编写


你可能只想创建一个JFrand并添加两个组件,一个用新的猎人创建的猎人和一个新的猎物创建的猎物,并考虑当你编写它们的非静态时,这些组件中的每一个是如何相互关联的!方法。

您的重新绘制方法是一个实例方法,因此需要在实例上调用它。你想调用哪个实例?您目前实际上并没有创建任何实例…repaint是一个实例方法JFrame,您需要一个类的实例才能调用该方法。另外,您是从JFrame扩展而来,但是在静态环境中创建第二个JFrame?frame方法,所以即使您能够在Main上调用repaint,它也不会有任何效果。停止使事物静态化-在GUI中过度使用/依赖静态==错误设计OP从JFrame扩展,但正在内部创建另一个JFrame,所以在Main上调用repaint不太可能有任何影响是的,我认为用户打算使用他在调用repaint方法之前创建的框架创建的框架,并在其他类中使用它。我尝试的是创建框架,然后在两个单独的类中在创建的框架上绘制对象,但这需要移动图形g,对吗?