Как мне объединить графические методы в Java?

Итак, я создаю игру, в которой мне понадобится несколько методов, которые могут выводить текст (в JFrame) или отображать изображения. Я создал GraphicsEngine, который имеет метод paintComponent, но дело в том, что это будет выполняться путем добавления его в JFrame, а не через мои вызовы, и я не могу вызывать другие методы GraphicsEngine, потому что для этого требуется объект Graphics2D... которого у меня не будет, когда я вызову методы. Как мне создать кучу методов, которые могут добавлять что-то в JFrame, не имея собственного компонента paintComponent? Пожалуйста помоги.

Вот мой GraphicsEngine, если кому-то это покажется актуальным.

import javax.swing.JComponent;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class GraphicsEngine extends JComponent
{
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("Splash.jpg"));
        } catch (IOException e) {
        }
        g2.drawImage(img, 0, 0, null);
    }

    public void textOut (Graphics2D g2, String text){

        for(char c : text.toCharArray()){
            System.out.print(c); //I want to be able to print this to JFrame     through g2's text printing methods.
            delay(30);
        }
    }  
}

person danishanish    schedule 08.03.2015    source источник
comment
Совет по загрузке изображения: не загружайте изображение каждый раз, когда вы его рисуете, это будет очень дорого. (img = ImageIO.read(new File("Splash.jpg"));) Загрузите его один раз во время инициализации и отрисуйте несколько раз.   -  person Erwin Bolwidt    schedule 08.03.2015
comment
Я не очень понимаю ваш другой вопрос, и я не думаю, что я один. Что вы пытаетесь сделать, и что из этого не работает?   -  person Erwin Bolwidt    schedule 08.03.2015
comment
1) g2.drawImage(img, 0, 0, null); a JComponent является ImageObserver, поэтому должно быть g2.drawImage(img, 0, 0, this);. 2) Не игнорируйте исключения, это аукнется вам сзади. 3) Учитывая, что изображение может быть null, если оно не загружено, лучше проверить if (img==null) {.. перед рисованием. 4) Используйте нотацию @Override для переопределенных методов. 5) Всегда сначала вызывайте метод super.paintComponent(g);. 6) Учитывая, что Splash.jpg, очевидно, является ресурсом приложения, он будет находиться внутри Jar и недоступен как File во время выполнения. Загрузите его по URL.   -  person Andrew Thompson    schedule 08.03.2015
comment
О, и, учитывая 7 либо неоптимальных, либо неправильных аспектов написания 9-строчного метода, очевидно, что вы неопытны. Я бы порекомендовал сначала более простые проекты. Собираясь делать игры, рассмотрите возможность использования игрового движка (где они, надеюсь, правильно поймут основы).   -  person Andrew Thompson    schedule 08.03.2015
comment
На самом деле это просто добавление графики в существующую текстовую игру, которую я сделал. да, я не очень опытен в этом   -  person danishanish    schedule 08.03.2015


Ответы (1)


Вам нужно вызвать getGraphics(), чтобы получить графику из JComponent.

public void textOut (String text){

        Graphics2D g2= getGraphics();
        for(char c : text.toCharArray()){
            g2.drawString("StackOverflow",40,20); //add your code with g2 to draw text
            delay(30);
        }
}  
person Md. Nasir Uddin Bhuiyan    schedule 10.03.2015