Как сделать TextField видимым при нажатии кнопки в Java?

Я пытаюсь создать программу с графическим интерфейсом, которая предоставляет пользователю кнопку. При нажатии этой кнопки отображается текстовое поле и предлагается пользователю ввести регулярное выражение.

Вот шаги, которые я предпринял до сих пор, чтобы реализовать это:

  1. Создал JFrame и добавил кнопку, метку и текстовое поле.

  2. Сначала установите для видимости текстового поля значение «false». Для видимости ярлыков и кнопок установлено значение «true».

  3. Реализован интерфейс ActionListener и переопределен метод ActionPerformed, чтобы изменить видимость textField на «true» при нажатии кнопки.

  4. Зарегистрировал экземпляр ActionListener для кнопки.

Когда я запускаю его таким образом, текстовое поле НЕ становится видимым после нажатия кнопки (он компилируется нормально, но в графическом интерфейсе ничего не происходит)

Однако, если я сначала изменю видимость метки на «false», а затем добавлю действие для установки «true» в ActionListener, оно сработает, и ОБА метка и текстовое поле станут видимыми при нажатии кнопки.

Я хочу знать, почему текстовое поле становится видимым только тогда, когда в ActionListener включена метка?

Другими словами, почему этот код НЕ работает?

import java.awt.FlowLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class RegularExpressionGui extends JFrame {

  private final JLabel label1; //label
  private final JTextField textField1;
  private JTextField textField2; //text field
  private final JButton button1; //button
  private final JTextArea textArea1; //textArea

  public RegularExpressionGui() {

      super("Regular Expression Lookup");
      setLayout(new FlowLayout()); //GUI Layout

      //add the components

      label1 = new JLabel("Regular Expression");
      label1.setVisible(true);
      add(label1);

      textField1 = new JTextField("Enter Regular Expression here");
      textField1.setVisible(false);
      add(textField1);

      button1 = new JButton("Lookup Expression");
      add(button1);

      textArea1 = new JTextArea("Results");
      add(new JScrollPane(textArea1)); //makes the output area scrollable

      LookupHandler lookup = new LookupHandler();
      button1.addActionListener(lookup);
      textField1.addActionListener(lookup);

    } //end constructor 

  //inner class containing ActionListner 
  private class LookupHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {

         if (event.getSource() == button1) {
          textField1.setVisible(true);

         }
       } 
  }

}

И почему вместо этого работает этот?

import java.awt.FlowLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class RegularExpressionGui extends JFrame {

  private final JLabel label1; //label
  private final JTextField textField1;
  private JTextField textField2; //text field
  private final JButton button1; //button
  private final JTextArea textArea1; //textArea

  public RegularExpressionGui() {

      super("Regular Expression Lookup");
      setLayout(new FlowLayout()); //GUI Layout

      //add the components

      label1 = new JLabel("Regular Expression");
      label1.setVisible(false);
      add(label1);

      textField1 = new JTextField("Enter Regular Expression here");
      textField1.setVisible(false);
      add(textField1);

      button1 = new JButton("Lookup Expression");
      add(button1);

      textArea1 = new JTextArea("Results");
      add(new JScrollPane(textArea1)); //makes the output area scrollable

      LookupHandler lookup = new LookupHandler();
      button1.addActionListener(lookup);
      textField1.addActionListener(lookup);

    } //end constructor 

  //inner class containing ActionListner 
  private class LookupHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {

               if (event.getSource() == button1) {
          textField1.setVisible(true);
          label1.setVisible(true);
         }
       } 
  }

}

person HGF    schedule 01.04.2016    source источник


Ответы (1)


Я не уверен на 100%, но я думаю, что вам не нужен внутренний класс.

Для вашей проблемы, если вы удалите внутренний класс и вместо этого реализуете ActionListener в своем классе RegularExpressionGui, затем добавьте pack() внутри actionPerformed, он должен работать, потому что pack() должен вызывать метод repaint. Если вы вызовете свой 1-й код и измените размер окна, теперь вы должны увидеть его, потому что при изменении его размера диспетчер компоновки вызывает метод перерисовки.

Итак, ваш класс должен выглядеть прямо сейчас так:

import java.awt.FlowLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class RegularExpressionGui extends JFrame implements ActionListener {

  private final JLabel label1; //label
  private final JTextField textField1;
  private JTextField textField2; //text field
  private final JButton button1; //button
  private final JTextArea textArea1; //textArea

  public RegularExpressionGui() {

      super("Regular Expression Lookup");
      setLayout(new FlowLayout()); //GUI Layout

      //add the components

      label1 = new JLabel("Regular Expression");
      label1.setVisible(true);
      add(label1);

      textField1 = new JTextField("Enter Regular Expression here");
      textField1.setVisible(false);
      add(textField1);

      button1 = new JButton("Lookup Expression");
      add(button1);

      textArea1 = new JTextArea("Results");
      add(new JScrollPane(textArea1)); //makes the output area scrollable

      //LookupHandler lookup = new LookupHandler();
      button1.addActionListener(this);
      textField1.addActionListener(this);
      pack();
      setVisible(true);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
    } //end constructor 

  //inner class containing ActionListner 
  @Override
  public void actionPerformed(ActionEvent event) {
       if (event.getSource() == button1) {
        textField1.setVisible(true);
        //label1.setVisible(true);
        pack();
       }
     } 
  public static void main (String args[]) {
    new RegularExpressionGui();
  }
}
person Frakcool    schedule 01.04.2016