gpt4 book ai didi

java - 绘制字符串时窗口卡住一次

转载 作者:行者123 更新时间:2023-12-01 20:21:50 25 4
gpt4 key购买 nike

当我用 Java 制作 2D 游戏时,发生了一个(至少对我来说)非常奇怪的问题。我提供了一个可运行的、简短的示例,它重现了我的问题。当红色方 block 的x坐标100120之间时,它应该绘制字符串“示例文本” 广场上方。但是,如果运行代码,您会看到窗口完全卡住几秒钟。滞后后,您可以毫无问题地浏览该区域,并且将显示文本。仅当程序在正方形上方绘制字符串时,才会出现此问题。如果我更改代码,以便只有另一个方 block 出现在红色方 block 上方,则不会出现延迟。 (我在代码中评论了这一点)

如有任何帮助,我们将不胜感激。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;


public class MyExample extends JApplet {

int x = 10;
int y = 150;

public void init() {

setFocusable(true);
requestFocus();
Action right = new moveRight();
Action left = new moveLeft();
JRootPane rootPane = getRootPane();
rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
rootPane.getActionMap().put("right", right);
rootPane.getActionMap().put("left", left);
getContentPane().add(new Paint());
}

protected class moveRight extends AbstractAction {
public void actionPerformed(ActionEvent e) {
x+=3;
repaint();
}
}
protected class moveLeft extends AbstractAction {
public void actionPerformed(ActionEvent e) {
x-=3;
repaint();
}
}

class Paint extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.RED);
g.fillRect(x,y,10,10);
g.setColor(Color.BLACK);
g.drawLine(100,100,100,200);
g.drawLine(129,100,129,200);
if(x>100&&x<120) {
g.setFont(new Font("TimesRoman", Font.PLAIN, 15));
g.setColor(Color.BLACK);
g.drawString("Sample Text",x-30,y-25);
//g.fillRect(x,y-15,10,10); - This work fine if you remove the g.setFont and the drawString
}
}
}

}

最佳答案

这与您尝试在 paintComponent 方法中加载字体以及底层 API 尝试在绘制字体及其详细信息之前加载字体这一事实有关。

我确实认为你可以使用类似的东西来预缓存字体

class Paint extends JPanel {

private Font paintFont;

public Paint() {
paintFont = new Font("TimesRoman", Font.PLAIN, 15);
setFont(paintFont);
}

但在我的测试中,这仍然不起作用,我实际上最终做的是添加对 getFontMetrics 的调用,这似乎强制 API 将字体及其属性加载到内存中,使其立即渲染,例如

class Paint extends JPanel {

private Font paintFont;

public Paint() {
paintFont = new Font("TimesRoman", Font.PLAIN, 15);
setFont(paintFont);
getFontMetrics(paintFont);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(x, y, 10, 10);
g.setColor(Color.BLACK);
g.drawLine(100, 100, 100, 200);
g.drawLine(129, 100, 129, 200);
if (x > 100 && x < 120) {
System.out.println("...");
//g.setFont(paintFont);
g.setColor(Color.BLACK);
g.drawString("Sample Text", x - 30, y - 25);
//g.fillRect(x,y-15,10,10); - This work fine if you remove the g.setFont and the drawString
}
}
}

现在,这将使您的应用程序加载速度稍微慢一些,但由于您已将字体加载移出了绘制周期,因此可以使其运行得更快

关于java - 绘制字符串时窗口卡住一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com