2016-04-01 3 views
0

Я пытаюсь создать программу GUI, которая предоставляет пользователю кнопку. Когда эта кнопка нажата, она отображает textField и предлагает пользователю ввести регулярное выражение.Как сделать TextField видимым при нажатии кнопки на Java?

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

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

  2. Установить видимость текстового поля, чтобы «ложь» изначально. Значок и кнопка . Видимость установлены на "true".

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

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

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

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

То, что я хочу знать, почему текстовое поле становится видимым только тогда, когда есть метка включается в 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); 
     } 
     } 
    } 

} 

ответ

0

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

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

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

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(); 
    } 
} 
Смежные вопросы