我想你遇到的問題是如何改變一下按鈕取決於已經輸入到GUI中的內容。請記住,使用GUI,用戶可以隨時以任何順序與任何啓用的GUI組件進行交互。關鍵是檢查按鈕的ActionListener中GUI的狀態,然後根據此GUI的狀態更改此方法的行爲。例如,如果你的GUI有三個JTextField的情況下,字段1,字段2,和sumField和一個JButton Add按鈕:
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
你想Add按鈕在字段1和字段2加號一起放入sumField的結果,你「再顯然不會想如果任何字段爲空做任何添加,所以你在JButton的ActionListener的測試吧:
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
// if we've reached this point, the user has entered in text and so we handle it
這裏的整個事情:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class WaitForInput extends JPanel {
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
public WaitForInput() {
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
try {
int number1 = Integer.parseInt(field1.getText());
int number2 = Integer.parseInt(field2.getText());
int sum = number1 + number2;
sumField.setText("" + sum);
} catch (NumberFormatException e1) {
// TODO: use JOptionPane to send error message
// clear the fields
field1.setText("");
field2.setText("");
}
}
});
add(field1);
add(new JLabel("+"));
add(field2);
add(new JLabel("="));
add(sumField);
add(addButton);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("WaitForInput");
frame.getContentPane().add(new WaitForInput());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
編輯1
否則,如果你絕對必須使用一個循環,那麼是的,在一個Runnable中做,然後在後臺線程中執行。請記住在循環內調用Thread.sleep(...),即使是短暫的,也不會佔用CPU。例如
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class HaltingProblem extends JPanel {
private static final int PANEL_HEIGHT = 400;
private static final int PANEL_WIDTH = 600;
private static final long SLEEP_DELAY = 100;
private Color[] colors = {Color.red, Color.orange, Color.yellow,
Color.green, Color.blue, Color.cyan};
private boolean halt = false;
private JButton haltButton = new JButton("Halt");
private int colorIndex = 0;
public HaltingProblem() {
setBackground(colors[colorIndex]);
haltButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
halt = !halt; // toggle it!
}
});
add(haltButton);
new Thread(new Runnable() {
public void run() {
while (true) {
keepDoingThis();
}
}
}).start();
}
private void keepDoingThis() {
try {
Thread.sleep(SLEEP_DELAY);
} catch (InterruptedException e) {}
if (halt) {
return;
}
colorIndex++;
colorIndex %= colors.length;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setBackground(colors[colorIndex]);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PANEL_WIDTH, PANEL_HEIGHT);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("HaltingProblem");
frame.getContentPane().add(new HaltingProblem());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
您需要更好地瞭解GUI的工作方式。你可以讓一個主程序無限循環。但是,這應該從GUI中分離出來。 GUI在其自己的線程(事件分派線程(EDT))中運行,並且您的主程序應該在其他線程中運行。當然,主線程和GUI線程有時必須進行通信,但這應該保持在最低限度。有一個標準的方式來處理Swing的線程,你應該閱讀教程(我知道它很長很複雜)。 – toto2 2011-06-05 14:47:51
@託託是正確的。你的解決方案不是一個很好的解決方案。要掌握手頭的問題,您需要打破對程序性,線性驅動程序的依賴,並學習*事件驅動程序的範例。圖形用戶界面幾乎完全由事件驅動。 – 2011-06-05 14:51:20