我已經在Java上創建了通用戰艦遊戲,並且包含了下面的代碼片段。我以與在GUI上使用控制檯相同的方式獲取用戶輸入,我有一個JLabel充當打印語句,一個JTextField接受用戶輸入,然後一個JButton來「提交」輸入。停止Java Swing在沒有用戶輸入的情況下執行
問題是因爲我創建的程序首先在沒有GUI的情況下工作,現在正在將其轉換爲程序,我認爲動作偵聽器正在逃離自己。我已經在用戶輸入船舶位置的地方開始了代碼片段,他們已經選擇了他們想要的每種類型船隻的數量。在這一點上,儘管我希望用戶輸入例如1(選擇水平),然後A4以A4開始船舶,在此之後,程序將保持循環直到所需數量的船舶已經放置。
但是,程序改爲向前跳躍,從不提示用戶輸入方向並將標籤更改爲「輸入猜測」(在CPU船上拍攝的下一個方法),並且控制檯打印出 「您想要船嗎? ?子水平或垂直 對於水平進入1號 或者垂直輸入數字2: 的CPU鏡頭是在42 CPU的出手的結果:錯過 輸入一個猜測」 本質上跳過來自用戶的任何輸入至於位置或方向,正如我所說,我認爲這可能是由於行動監聽器,雖然我不確定,理想情況下,程序將運行,並且一達到任何label1.getText();程序會「暫停」直到用戶輸入文本,然後按下提交按鈕,然後繼續運行。
所以我的問題是有沒有將這個「破發」或‘暫停’入代碼,而無需改變整個程序的方式嗎?
for (int i = 0; i < ship.size(); i++)
{
final int shipNumber = i;
while (!worked)
{
playerLocationToSet.clear();
worked = true;
label1.setText("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal(enter 1) or vertical(enter 2) ?");
System.out.println("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal or vertical ?");
System.out.println("For horizontal enter number 1");
System.out.println("Or for vertical enter number 2: ");
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent f){
int addLetter;
int addNumber;
String orientString = textField1.getText();
int orient = Integer.parseInt(orientString);
// horizontal
if (orient == 1)
{
addLetter = 0;
addNumber = 1;
}
// vertical
else if (orient == 2)
{
addLetter = 1;
addNumber = 0;
}
int letterNumber = 0;
label1.setText("Where would you like to start " + ship.get(shipNumber).getName() + "?");
String start = textField1.getText();
start = start.toUpperCase();
int letter = start.charAt(0);
int number = start.charAt(1) - 48;
for (int x = 0; x < alphabet.length; x++)
{
if(alphabet[x] == letter)
{
letterNumber = x + 1;
}
}
for (int j = 0; j <ship.get(shipNumber).getSize(); j++)
{
String position = "" + letterNumber + number;
playerLocationToSet.add(position);
letterNumber = letterNumber + addLetter;
number = number + addNumber;
for (int t = 0; t < ship.size(); t++) }
});
ship.get(i).setLocation(playerLocationToSet);
}
}
}
private void playerShoot()
{
String guess;
String result;
char[] alphabet = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char letter;
int number;
int guessLetter = 0;
String finalGuess;
while (!CPUship.isEmpty())
{
result = "miss";
label1.setText("Enter a guess");
System.out.println("Enter a guess");
guess = textField1.getText();
guess = guess.toUpperCase();
letter = guess.charAt(0);
number = guess.charAt(1) - 48;
道歉這麼長的問題,我想嘗試使它儘可能清晰。隨意問任何問題,無疑我錯過了一些東西。提前 感謝
事件驅動的GUI編碼需要與您的程序完全不同的方法,並且如果您的控制檯程序沒有正確完成(例如,沒有像樣的OOP兼容類),那麼通常最好的做法是僅僅取消線性控制檯類型代碼並使用符合OOP的模型類重寫它,其中包含更改狀態的方法以及事件驅動的GUI代碼,以允許用戶與模型進行交互。 –
請勿使用「代碼段」按鈕來標記代碼。只需使用'{}'按鈕。 – camickr
例如,'while(!worked)'類型的循環對於GUI不起作用,不應該在那裏。請注意,它可能會導致輸入Swing事件線程,從而凍結程序。我同意@ camickr的回答(1+),但仍然建議你重寫。這些巨大的方法應該完全重新考慮因素,因爲這樣做會使您的代碼更具可讀性和可調試性,不僅適用於我們,也適用於您。 –