我遇到了一些我写过的代码问题。我试图从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();
}
}
亨特和这个班级的猎人是两个外部阶级。错误发生在main方法中,在repaint()上,任何建议/方向都会非常感激!
答案 0 :(得分:0)
同样的原因是在Component类中,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();
答案 1 :(得分:0)
您必须了解静态方法和实例方法之间的区别。
静态方法可以执行与特定对象的状态无关的操作。他们可以创建新对象,对给定参数运行操作,或操纵静态字段。
但是,这些只存在于类中,与任何特定对象无关。
要使用swing,您可以创建实际对象 - 不同的面板,按钮和其他组件。它们中的每一个都是一个对象,并且可以有许多同一类的对象(许多Button
s,许多Frames
)。每个对象的状态决定了它的行为方式。按下一个按钮会做一件事,另一件按钮会做另一件事。一个有这种颜色,另一个有这种颜色等。
所以像repaint()
这样的行为甚至设置一个动作监听器都不是一个适用于整个类的行为,只适用于一个特定的对象,按钮,面板等。
因此,应使用Hunted
和Hunter
创建的特定实例的视图创建您的hunter = new Hunter(...)
和hunted = new Hunted()
类行为,并且应调用其方法与对象的引用,而不是直接来自类,因为这些方法与特定对象的状态有关,而这些对象正在屏幕上绘制等。
我不确定你是否希望Main成为JFrame。但是如果你这样做,你必须创建一个new Main()
并添加任何组件。不只是创建一些JFrame,然后期望paintComponent()
方法应用于它,因为你把它写成Main()的方法。
您可能只想创建一个JFrame并添加两个组件,一个Hunter(使用new Hunter()
创建)和一个Hunted(使用new Hunted()
创建),并考虑每个组件如何关联当你编写他们的(非静态!)方法时,彼此之间。