Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I think the problem you're having is how to change what the button does depending on what has been entered into the GUI. Remember that with a GUI, the user can interact with any enabled GUI component at any time and in any order. The key is to check the state of the GUI in your button's ActionListener and then altering the behavior of this method depending on this GUI's state. For example if your GUI had three JTextFields, field1, field2, and sumField and a JButton addButton:</p> <pre><code> private JTextField field1 = new JTextField(5); private JTextField field2 = new JTextField(5); private JTextField sumField = new JTextField(5); private JButton addButton = new JButton("Add"); </code></pre> <p>And you wanted the addButton to add the numbers in field1 and field2 together and place the results into the sumField, you're obviously not going to want to do any addition if either field is left blank, and so you test for it in the JButton's ActionListener:</p> <pre><code> 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 </code></pre> <p>Here's the whole thing:</p> <pre><code>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(); } }); } } </code></pre> <p><strong>EDIT 1</strong><br> Otherwise if you absolutely have to use a loop, then yes, do it in a Runnable and do that in a background Thread. Remember to call Thread.sleep(...) inside of the loop even for a short bit so it doesn't hog the CPU. For example</p> <pre><code>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(); } }); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload