Я думаю, что ваша проблема в том, как изменить то, что делает кнопка, в зависимости от того, что было введено в GUI. Помните, что с GUI пользователь может взаимодействовать с любым включенным компонентом GUI в любое время и в любом порядке. Ключ должен проверить состояние GUI в ActionListener вашей кнопки и затем изменить поведение этого метода в зависимости от состояния этого GUI. Например, если в вашем графическом интерфейсе было три JTextFields, field1, field2 и sumField и JButton addButton:
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
И вы хотели, чтобы addButton сложил числа в field1 и field2 вместе и поместил результаты в sumField, вы, очевидно, не захотите делать какие-либо добавления, если любое из полей оставлено пустым, и поэтому вы проверяете его в ActionListener JButton:
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 (...) внутри цикла даже на короткое время, чтобы он не перегружал процессор. Например
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();
}
});
}
}