我正在嘗試制作一個簡單的游戲,在用戶鍵入時顯示用戶鍵入的單詞。但是,我不確定如何呼叫或更新write()方法,以便在每次添加或洗掉新字符時在用戶鍵入時顯示字串currentWord 。
我不確定這是否是解決此問題的正確方法:
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.util.*;
public class CopyOfGamePanel extends Canvas {
public static String currentWord = "BEGIN";
public static void main(String[] args) {
String[] acceptable = {
"pressed A",
"pressed B",
"pressed C",
"pressed D",
"pressed E",
"pressed F",
"pressed G",
"pressed H",
"pressed I",
"pressed J",
"pressed K",
"pressed L",
"pressed M",
"pressed N",
"pressed O",
"pressed P",
"pressed Q",
"pressed R",
"pressed S",
"pressed T",
"pressed U",
"pressed V",
"pressed W",
"pressed X",
"pressed Y",
"pressed Z"
};
JFrame frame = new JFrame();
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setFocusable(true);
Canvas canvas = new CopyOfGamePanel();
canvas.setSize(500, 700);
canvas.setBackground(Color.white);
frame.getContentPane().add(canvas);
frame.pack();
frame.setVisible(true);
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new java.awt.KeyEventDispatcher() {
public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
if (key.equals("pressed BACK_SPACE"))
deleteLetter();
if (Arrays.asList(acceptable).contains(key)) {
addLetter(key);
frame.pack();
}
//System.out.println(key);
return true;
}
});
}
public void paint(Graphics g) {
backgroundGUI(g);
write(g);
}
public void backgroundGUI(Graphics g) {
g.drawLine(0, 300, 500, 300);
}
public void write(Graphics g) {
g.drawString(currentWord, 50, 290);
}
public static void addLetter(String key) {
char letter = key.charAt(8);
currentWord = currentWord letter;
System.out.println("Current Word: " currentWord);
}
public static void deleteLetter() {
System.out.println("Delete a letter");
if (currentWord.length() > 0) {
currentWord = currentWord.substring(0, currentWord.length() - 1);
System.out.println("Current Word: " currentWord);
} else {
System.out.println("There are no more letters to delete");
}
}
}
uj5u.com熱心網友回復:
您正在尋找Canvas#repaint觸發新的繪制周期。
首先,我將鍵盤輸入處理隔離到CopyOfGamePanel類本身,因此它可以自動進行更新。如果您需要輸入以通過其他作業流程(出于某些奇怪的原因),則CopyOfGamePanel需要通知(可能通過某種觀察者/偵聽器回呼)所需的資訊并重新繪制自身。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.util.Arrays;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new CopyOfGamePanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CopyOfGamePanel extends Canvas {
public static String currentWord = "BEGIN";
private String[] acceptable = {"pressed A", "pressed B", "pressed C", "pressed D", "pressed E", "pressed F", "pressed G",
"pressed H", "pressed I", "pressed J", "pressed K", "pressed L", "pressed M", "pressed N", "pressed O",
"pressed P", "pressed Q", "pressed R", "pressed S", "pressed T", "pressed U", "pressed V", "pressed W",
"pressed X", "pressed Y", "pressed Z"};
public CopyOfGamePanel() {
setBackground(Color.WHITE);
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new java.awt.KeyEventDispatcher() {
public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
if (key.equals("pressed BACK_SPACE")) {
deleteLetter();
}
if (Arrays.asList(acceptable).contains(key)) {
addLetter(key);
}
return true;
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 700);
}
public void paint(Graphics g) {
backgroundGUI(g);
write(g);
}
public void backgroundGUI(Graphics g) {
g.drawLine(0, 300, 500, 300);
}
public void write(Graphics g) {
g.drawString(currentWord, 50, 290);
}
public void addLetter(String key) {
char letter = key.charAt(8);
currentWord = currentWord letter;
System.out.println("Current Word: " currentWord);
repaint();
}
public void deleteLetter() {
System.out.println("Delete a letter");
if (currentWord.length() > 0) {
currentWord = currentWord.substring(0, currentWord.length() - 1);
System.out.println("Current Word: " currentWord);
} else {
System.out.println("There are no more letters to delete");
}
repaint();
}
}
}
出現了關于為什么的問題:
- 你需要使用
Canvas它,這是一個相當“低級”的組件,所以除非你真的在使用BufferStrategy它似乎是一種浪費(和可能的問題的來源) - 您沒有使用
JTextField(或者如果您非常喜歡 AWT,TextField)來管理用戶輸入 - 您沒有使用
KeyListener,沒有冒犯,但是KeyboardFocusManager像這樣使用很像嘗試用 C4 破解花生,當然,它可能會起作用,但也可能會造成混亂。
我想你可能想看看:
- 使用 Swing 創建 GUI
- 如何使用文本欄位
- 如何撰寫關鍵監聽器
- 在 AWT 和 Swing 中繪畫并執行自定義繪畫
如果您剛剛開始使用這種東西,那么看看 JavaFX 可能會更好
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/457792.html
