我正在製作一個使用swing的遊戲畫布,並決定使用JTextField
來輸入用戶名和密碼。鍵入閃爍黑色的JTextField
我正在緩衝圖像,然後將其渲染到屏幕上,而不是直接在面板上實時繪製所有內容。
我已經遇到了一個問題,雖然,我畫的背景,並已我的兩個文本字段設置爲不透明的,但似乎每次我去輸入內容的文本字段的它閃爍一個黑盒子,其中JTextField
是。
它發生在我的用戶名和密碼字段。任何想到這可能是什麼原因?
其他有用的信息:每當我點擊一個文本框,這兩個組件在第一個字符將會變成黑色時閃爍。
編輯 - 我剛剛注意到登錄按鈕我也閃爍黑色當MOUSE_ENTERED
和MOUSE_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());
}
}
}
下面是文本字段:(從一個單獨的類完全調用到的GamePanel使用getPanel()...)
//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);
謝謝!
這聽起來像是一個不透明和/所有繪畫的問題。想要粘貼一些示例代碼,以便我們可以停止猜測 – MadProgrammer
看起來您的代碼中存在一個錯誤。我敢打賭,儘管我希望我錯了,但你必須展示一些才能得到體面的回答。最好是[sscce](http://sscce.org)。 –
你的代碼讓我有點擔心,是否有可能看到至少主要的渲染實現以及如何構建UI,請 – MadProgrammer