【问题标题】:Java Graphics Error: Static / Nonstatic mishapJava 图形错误:静态/非静态事故
【发布时间】:2014-05-18 07:43:37
【问题描述】:

所以,我正在做一个插槽项目,因为我想熟悉 java 图形库。该设置工作得相当完美。然后,我尝试画一条线来测试图形,得到了错误:

engine.java:9: non-static method drawLine(int,int,int,int) cannot be referenced from a static context java.awt.Graphics.drawLine(1, 2, 11, 12); ^ 1 error

我听从朋友的建议,创建了一个新的engine 并将其命名为e,然后我没有使用drawloop(),而是使用了e.drawloop,但出现了同样的错误。

代码:

import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class engine{
    public void drawloop(){
        java.awt.Graphics.drawLine(1, 2, 11, 12);
    }
    public static void main(String[] args){
           SwingUtilities.invokeLater(new Runnable()
                {
                 public void run()
                 {
                    display();
                 }
                });
        engine e = new engine();
        e.drawloop();
    }
    public static void display(){
        JFrame window = new JFrame("Pinnacle Slots");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setPreferredSize(new Dimension(768, 512));
        window.pack();
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }
}

【问题讨论】:

  • 你没有正确使用swing。完全没有。
  • 看看我为另一个问题创建的这个简单示例。 github.com/anubiann00b/JFrameExample
  • 您正在尝试调用Graphics 类的非静态成员。你需要一个Graphics 的对象。如果我记得 awt 编程正确,你的画布/容器应该有一个 repaint() (或类似的东西)方法,框架将通过传递 Graphics 类的对象来调用。
  • 不要听你的“朋友”,当然也不要胡乱猜测。阅读教程并遵循它们。有关更多信息,请参阅@peeskillet 的链接。

标签: java swing graphics


【解决方案1】:

发生的情况是使用了错误的“绘画”调用。通常,会覆盖内置的paint() 或paintComponent() 方法。

与您的代码一起使用的示例:

@Override
public void paint(Graphics g) { //This is where that instance of Graphics comes in
    super.paint(g); //necessary for the actual JFrame to paint itself
    g.drawLine(startX, startY, endX, endY); //and, very simply, draw the line
}

这将在运行时自动调用,但如果您想手动再次调用它(或在其他位置画线)只需使用

repaint().

另外,一个好的做法是为您的 JFrame 设置一个 contentPane。您可以使用自定义 JPanel/JComponent 或简单地使用

 setContentPane(getContentPane());
在 display() 方法中。

我希望这可以帮助您和其他任何人解决此问题!

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多