Вы понимаете, что вы делаете, не имеет никакого смысла?
В краске на вашем Холсте вы рисуете на Рамку (на страте ), а не на холсте.
Забудьте о 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();
}
}
}