Ссылка на компоненты JPanel из JFrame - PullRequest
1 голос
/ 17 октября 2011

У меня есть приложение, создающее JPanel в JFrame следующим образом:

public class Frame1{
    public Frame1(){
        Frame2 f2 = new Frame2();
        f2.pack();
        f2.setVisible(true);
    }

    class Frame2 extends JFrame{
        public Frame2(){
            JPanel p1 = new JPanel();
            JTextField txt1 = new JTextField("Test",12);
            p1.add(txt1);
            JButton btn1 = new JButton("Click Me!");
            p1.add(btn1);
            add(p1);
            btn1.addActionListener(this);
        }
        public void actionPerformed(ActionEvent e){
            JOptionPane.showDialog(null,text of the textbox);
        }
    }
}

Есть ли способ ссылаться на текстовое поле, даже если это не переменная поля, а просто объявлено внутри конструктора(this.getRootPane().getParent() даст мне кадр, в который я верю, но куда мне идти оттуда)?

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Еще раз повторюсь, почему бы просто не сделать свой JTextField частным нестатическим полем класса:

import java.awt.event.*;
import javax.swing.*;

public class Frame1 {
   public Frame1() {
      Frame2 f2 = new Frame2();
      f2.pack();
      f2.setVisible(true);
   }

   class Frame2 extends JFrame implements ActionListener {
      private JTextField txt1;

      public Frame2() {
         JPanel p1 = new JPanel();

         // JTextField txt1 = new JTextField("Test", 12);
         txt1 = new JTextField("Test", 12);

         p1.add(txt1);
         JButton btn1 = new JButton("Click Me!");
         p1.add(btn1);
         add(p1);
         btn1.addActionListener(this);
      }

      // if outside classes need to see the text
      public String getTxt1Text() {
         return txt1.getText();
      }

      public void actionPerformed(ActionEvent e) {
         JOptionPane.showMessageDialog(this, txt1.getText());
      }
   }
}
2 голосов
/ 17 октября 2011

Если вы хотите получить ссылку на JTextField, который вы объявили только внутри конструктора, то единственный вариант - получить его с помощью основного JFrame, что-то вроде этого:

JTextField textField = (JTextField) ((JPanel) getContentPane().getComponents()[0]).getComponents()[0];
JOptionPane.showMessageDialog(null, textField.getText());

Или для общего решения:

private JTextField textField;

getJTextField(this); // Call this from inside the constructor

// ...

private boolean getJTextField(Container c)
{
    Component[] cmps = c.getComponents();
    for (Component cmp : cmps)
    {
        if (cmp instanceof JTextField)
        {
            textField = (JTextField) cmp;
            return true;
        }
        if (cmp instanceof Container)
        {
            if(getJTextField((Container) cmp)) return true;
        }
    }
    return false;
}

Тем не менее, объявление JTextField как поля класса облегчает вам жизнь.

...