Пользовательский объект Canvas не перерисовывается автоматически - PullRequest
1 голос
/ 05 сентября 2011

Я создаю серверную / клиентскую MMO как летний проект, прежде чем вернуться в старшую школу, и я решил использовать Reddwarf и Swing для своей клиентской стороны.Я создал объект GameCanvas, который расширяет (как вы уже догадались) Canvas и переопределил метод рисования.

Вот мой метод рисования:

    /**
 * Base for drawing the map, player, etc.
 */
@Override
public void paint(Graphics graphics) {
    graphics.dispose();
    if(strat == null) {
        return;
    }
    Graphics2D g = (Graphics2D) strat.getDrawGraphics();
    g.drawString(String.valueOf(System.currentTimeMillis()), 200, 200);
    g.dispose();
    strat.show();
}

Strat - это двухслойная буферная стратегия, которая вытягиваетсяиз содержащего JFrame (который имеет много других компонентов)

GameCanvas также находится внутри JPanel, который не содержит ничего, кроме самого GameCanvas.

Я запускаю свою программу и вижумое текущее время в миллисекундах с некоторыми испорченными цифрами ближе к концу, а весь JFrame и все содержащиеся в нем компоненты отображаются серым цветом.

Что происходит?Оо, я много чего делал с холстом раньше, и ничего подобного не происходило.: /

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Вы понимаете, что вы делаете, не имеет никакого смысла?

В краске на вашем Холсте вы рисуете на Рамку (на страте ), а не на холсте.

Забудьте о BufferStrategy, кроме его создания, и просто рисуйте в соответствующие компоненты и позвольте JFrame беспокоиться об обработке двойной буферизации.

/**
 * Base for drawing the map, player, etc.
 */
@Override
public void paint(Graphics graphics) {
    Graphics g = graphics.create();
    g.drawString(String.valueOf(System.currentTimeMillis()), 200, 200);
    g.dispose();
}

Я также согласен с camickr в том, что Canvas - не лучшая вещь для рисования, используйте JPanel. Я знаю, что это не имеет особого смысла, если вы просто посмотрите на названия классов, но это действительно работает лучше.

Также он не будет перекрашиваться, если вы не предоставите ему причину перекрасить. Попробуйте из своей ветки игры позвонить myJFrame.repaint();.


Вот SSCCE , который отлично работает.

Вот почему так важен SSCCE. Мне приходилось делать предположения, и когда я подключил ваш фрагмент кода к тому, что он работал, проблем не было, поэтому я не могу дать вам конструктивный совет, как решить вашу проблему.

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class DrawFrame extends JFrame {
    DrawPanel drawPanel;
    static boolean running = false;
    public DrawPanel getDrawPanel() { return drawPanel; }

    public DrawFrame() {
        drawPanel = new DrawPanel();
        add(drawPanel);
    }

    public static void main(String[] args) {
        final DrawFrame mainGui = new DrawFrame();
        final DrawPanel drawPanel = mainGui.getDrawPanel();

        Timer timer = new Timer(0, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mainGui.setSize(300, 200);
                mainGui.setVisible(true);
                mainGui.createBufferStrategy(2);
                running = true;
            }
        });
        timer.setRepeats(false);
        timer.start();

        while (true && (!running || mainGui.isVisible())) {
            drawPanel.repaint();
        }
    }

    public class DrawPanel extends JPanel {

        @Override
        public void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
            Graphics g = graphics.create();
            g.drawString(String.valueOf(System.currentTimeMillis()), 100, 100);
            g.dispose();
        }
    }

}
2 голосов
/ 05 сентября 2011

Если бы мне пришлось угадывать, что происходит, я бы сказал, что вы не рисуете фон, прежде чем раскрасить текст.

Вы говорите, что это вопрос Swing, и все же вы используете Canvas.По умолчанию Swing имеет двойную буферизацию, и я не вижу смысла использовать компоненты AWT с состоянием буфера.

Я никогда раньше не создавал MMO, но думаю, что время отклика в Интернете будет намного медленнее, чем время рисования Swing.Когда-нибудь.Поэтому я бы посоветовал вам просто использовать JPanel, если для рисования вам нужна пользовательская покраска и переопределить метод paintComponent ().Не забудьте вызвать super.paintComponent () при запуске.

...