Java Graphics.drawString并不总是有效
以前有人遇到过这个问题吗?有时显示字符串,有时显示一半,有时不显示任何字符串。当使用VolatileImage而不是BuffereImage作为后台缓冲时,问题更加严重Java Graphics.drawString并不总是有效,java,graphics,drawstring,Java,Graphics,Drawstring,以前有人遇到过这个问题吗?有时显示字符串,有时显示一半,有时不显示任何字符串。当使用VolatileImage而不是BuffereImage作为后台缓冲时,问题更加严重 public class Game3D { public static void main(String[] args) { Game3D game = new Game3D(); game.start(); } public Game3D() { frame = new JFrame();
public class Game3D {
public static void main(String[] args) {
Game3D game = new Game3D();
game.start();
}
public Game3D() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canv = new GameCanvas();
canv.setPreferredSize(new Dimension(800, 600));
frame.add(canv);
frame.pack();
frame.setVisible(true);
}
private JFrame frame;
private GameCanvas canv;
public void start() {
canv.createBuffer(canv.getPreferredSize());
loadingScreen("Loading", 10);
}
public void loadingScreen(String msg, int done) {
Graphics2D g = canv.img.createGraphics();
try {
g.setColor(Color.BLACK);
g.fillRect(0, 0, canv.getWidth(), canv.getHeight());
int sizeX = 400, sizeY = 50;
int loadX = canv.getWidth() / 2 - sizeX / 2;
int loadY = canv.getHeight() / 2 - sizeY / 2;
g.setColor(Color.RED);
g.drawRect(loadX, loadY, sizeX, sizeY);
g.fillRect(loadX + 2, loadY + 2, (int) (sizeX / 100F * done), sizeY - 3);
int textX = canv.getWidth() / 2 - g.getFontMetrics().stringWidth(msg) / 2;
int textY = canv.getHeight() / 2 - g.getFontMetrics().getHeight() / 2;
g.setColor(Color.WHITE);
g.setFont(canv.font);
g.drawString(msg, textX, textY);
} finally {
g.dispose();
}
}
}
类GameCanvas扩展画布{
GameCanvas() {
}
BufferedImage img;
Font font;
void createBuffer(Dimension dim) {
img = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB);
font = new Font(Font.MONOSPACED, Font.PLAIN, 16);
}
@Override
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}我想您可能需要调用frame.repaint;为了让你画的东西正确地显示出来,虽然我不能完全确定。我只记得这是我自己在使用Java GUI时出现一些问题的原因。代码需要在SWING线程中运行 首先,主线程中的代码没有在swing线程中运行。尝试使用SwingUtilities.invokeLater。我在swing线程中运行了框架初始化代码,似乎已经解决了这个问题。谢谢,伙计。不要把秋千和AWT组件混在一起!嗯,除了字符串之外,它还绘制了更多的GUI组件,它们正在显示。此时,我只将帧渲染一次到BuffereImage,然后将其存储起来以便重新绘制。drawString调用从未实际绘制到BuffereImage。此外,当使用VolatileImage时,问题似乎会恶化。