gpt4 book ai didi

java - JTextField on Key Entered 闪烁黑色

转载 作者:行者123 更新时间:2023-11-29 08:03:31 26 4
gpt4 key购买 nike

我正在使用 swing 制作游戏 Canvas ,并决定使用 JTextField 将用户名和密码输入到面板中。

我正在缓冲图像,然后将其渲染到屏幕上,而不是将所有内容直接实时绘制到面板上。

虽然我遇到了一个问题,我画了一个背景并将我的两个文本字段都设置为不透明,但似乎每当我在这些文本字段中输入内容时它都会闪烁一个黑框,其中 JTextField 是。

它发生在我的用户名和密码字段中。知道这可能是什么原因吗?

其他有用信息:每当我单击一个文本框时,两个组件都会在第一个字符所在的位置闪烁黑色。

编辑——我刚刚注意到当 MOUSE_ENTEREDMOUSE_EXIT 时,我的登录按钮也闪烁黑色。

public class GamePanel extends JPanel implements Runnable {


public GamePanel(int width, int height) {
this.pWidth = width;
this.pHeight = height;

setController(new LoginGameController(this));

setPreferredSize( new Dimension(pWidth, pHeight));
setBackground(Color.BLACK);

setFocusable(true);
requestFocus(); // the JPanel now has focus, so receives key events

// create game components

addMouseListener(this);
addKeyListener(this);

setLayout(null);

startGame();
}
private void startGame()
// initialise and start the thread
{ if (animator == null) {
animator = new Thread(this);
animator.start();
}
}

public void run() {
while(true) {
gameUpdate();
if(getGraphics() != null){
gameRender(); // render the game to a buffer
paintScreen(); // draw the buffer on-screen
}
try {
Thread.sleep(28);
} catch (InterruptedException e) {}
}
}

private void paintScreen() {
Graphics2D g = (Graphics2D) getGraphics();

if ((g != null) && (img != null))
g.drawImage(img, 0, 0, null);

Toolkit.getDefaultToolkit().sync();
g.dispose();
}

private void gameRender() {
if(getWidth() > 0 && getHeight() > 0)
img = createImage(getWidth(), getHeight());

if(img != null) {
Graphics2D g = (Graphics2D) img.getGraphics();
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.fillRect(0, 0, pWidth, pHeight);

getController().render(img);

paintComponents(img.getGraphics());


}
}

}

这是文本字段:(来自完全使用 getPanel() 调用 GamePanel 的单独类...)

//Setup Login fields
usernameTF = new JTextField();
usernameTF.setOpaque(false);
usernameTF.getCaret().setBlinkRate(0);
usernameTF.setForeground(Color.WHITE);
usernameTF.setBounds(USERNAME_FIELD);
usernameTF.setBorder(null);
getPanel().add(usernameTF);

passwordTF = new JPasswordField();
passwordTF.setOpaque(false);
passwordTF.getCaret().setBlinkRate(0);
passwordTF.setForeground(Color.WHITE);
passwordTF.setBounds(PASSWORD_FIELD);
passwordTF.setBorder(null);
getPanel().add(passwordTF);

loginBtn = new JButton();
loginBtn.setOpaque(false);
loginBtn.setBackground(null);
loginBtn.setBorder(null);
loginBtn.setBounds(LOGIN_BUTTON);
loginBtn.addMouseListener(getPanel());
getPanel().add(loginBtn);

谢谢!

最佳答案

基本问题是,您绕过了 Swings 重绘过程,并且在更新图形时没有遵循 EDT。

JComponent#getGraphics 是一个临时/临时缓冲区,将在下一次重绘时重新绘制。此外,如果图形不是您创建的,则不应丢弃它!

public void run() {
while(true) {
gameUpdate();
if(getGraphics() != null){
gameRender(); // render the game to a buffer
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
paintScreen(); // draw the buffer on-screen
}
});
} catch (Exception exp) {
exp.printStackTrace(); // please clean this up
}
}
try {
Thread.sleep(28);
} catch (InterruptedException e) {}
}
}

我不知道这是否能解决问题,但不会有什么坏处。 (这会影响你的 FPS,你应该考虑绘画需要多长时间以及你想要等待多长时间)

或者,不是调用 paintScreen(),而是调用 repaint(或让 paintScreen 执行)并覆盖 paintComponent 方法绘制缓冲区。

这将允许 Swing 恢复对绘制过程的正确控制。

关于java - JTextField on Key Entered 闪烁黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926146/

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