이전에이 문제가 발생한 사람이 있습니까? 때로는 문자열이 표시되지만 때로는 문자열의 일부가 표시되지 않는 경우도 있습니다. BufferedImage 대신에 VolatileImage를 백 버퍼로서 사용하면 (자) 문제가 악화됩니다.Java Graphics.drawString이 항상 작동하지 않는 경우
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를 내가 당신이 내가 '하지만 제대로 표시 그리는 것을 갖기 위해 frame.repaint();
를 호출 할 필요가 있다고 생각 캔버스 {
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);
}
}
주 스레드의 코드가 스윙 스레드에서 실행되고 있지 않습니다. SwingUtilities.invokeLater()를 사용해보십시오. http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html – Bill
스윙 스레드 내부에서 프레임 초기화 코드를 실행했는데 문제가 해결 된 것 같습니다. 고마워. – Colby
AWT 구성 요소와 스윙을 혼합하지 마십시오! –