在主类之外使用Java的2d图形

时间:2011-12-15 02:23:58

标签: java swing graphics 2d awt

我有一个名为survival的类,它包含main方法,初始化程序。不是将图形代码放在这个类中,而是如何将它移动到一个与生存分开的新类中?

这是Survival.java:

package survival;
import javax.swing.*;

public class Survival extends JFrame { 
    private static int applicationWidth = 1024;
    private static int applicationHeight = 768;

    public Survival() {
        setTitle("Survival");
        setResizable(false);
        setSize(applicationWidth, applicationHeight);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new Survival();
    }
}

这是GraphicsDisplay.java:

package survival;
import java.awt.*;
import javax.swing.*;

public class GraphicsDisplay extends JPanel {
   @Override public void paintComponent(Graphics g) {
       g.fillOval(50, 50, 100, 100);
   }
}

3 个答案:

答案 0 :(得分:3)

您似乎只能在add()构造函数中GraphicsDisplay Survival的实例。

...
setResizable(false);
add(new GraphicsDisplay());
setSize(applicationWidth, applicationHeight);
...

在这种情况下,GraphicsDisplay充当隐式圆形模型视图。您可以查看此example如何以Model–View–Controller模式分隔类。

由于GraphicsDisplay是完全由您的程序呈现的自定义组件,因此请考虑覆盖getPreferredSize()以定义面板的几何图形。然后封闭的框架可以使用pack(),而不知道游戏中使用的其他显示面板。这个LissajousPanel就是一个例子。

答案 1 :(得分:2)

您必须扩展JPanel(JComponent)并覆盖paintComponent(Graphics g)方法。

例如,

public class MyPanel extends JPanel
{ 
   @Override
   public void paintComponent(Graphics g) {
       super.paintComponent(g); // suggestion of @kleopatra
   }
}

答案 2 :(得分:0)

在构造函数中,将组件(JPanel)添加到容器(JFrame):

public Survival() {
    setTitle("Survival");
    setResizable(false);
    setSize(applicationWidth, applicationHeight);

    this.getContentPane().add( new GraphicsDisplay() );

    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}