Использование 2D-графики Java вне основного класса - PullRequest
1 голос
/ 15 декабря 2011

У меня есть класс с названием «Выживание», который содержит основной метод, инициализирующий программу. Вместо того, чтобы помещать код для графики в этот класс, как я могу переместить его в новый класс, который отделен от выживания?

Вот 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 ]

3 голосов
/ 15 декабря 2011

Кажется, что вы можете просто add() экземпляр GraphicsDisplay в конструкторе Survival.

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

В этом случае GraphicsDisplay действует как представление вашей неявной, круговой модели . Вы можете посмотреть, как этот пример разделяет классы в шаблоне Модель – Представление – Контроллер .

Поскольку GraphicsDisplay - это пользовательский компонент, который полностью отображается вашей программой, рассмотрите возможность переопределения getPreferredSize() для определения геометрии панели. Тогда вмещающая рамка может просто использовать pack(), ничего не зная о других панелях дисплея, используемых в игре. Это LissajousPanel является примером.

2 голосов
/ 15 декабря 2011

Вы должны расширить JPanel (JComponent) и переопределить метод paintComponent(Graphics g).

Например,

public class MyPanel extends JPanel
{ 
   @Override
   public void paintComponent(Graphics g) {
       super.paintComponent(g); // suggestion of @kleopatra
   }
}
0 голосов
/ 15 декабря 2011

В конструкторе добавьте компонент (JPanel) в контейнер (JFrame):

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

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

    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}
...