Использование ArrayList в JPanel - PullRequest
0 голосов
/ 13 мая 2011

Класс SampleFiveA расширяет JPanel.Он содержит текстовые поля, одно под другим, каждое из которых имеет метку слева.Все текстовые поля будут одинаковой ширины и расположены напротив правой границы панели.SampleFiveA имеет только один конструктор, который принимает следующие три параметра:

Имена ArrayList, значения ArrayList, int cols

Я до сих пор создавал пример экрана пароля для имени пользователя в GUI, но теперь у меня возникла проблема с реализациейArrayList в JPanel один для имени пользователя и другой для пароля.Вид застрял там на несколько часов, теперь не могу найти подходящий пример, чтобы сделать это.Ниже приведен код, который я прокомментировал, что мне нужно сделать, используя ArrayList.

public class SampleFiveA extends JPanel {


ArrayList<String> names = new ArrayList<String>(); //the text for the labels
ArrayList<String> values = new ArrayList<String>(); // the initial contents of the text fields
int col ; //the number of columns used to set the width of each textfield


public SampleFiveA()
{
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(2,2)); 

        JLabel lab1 = new JLabel("User Name", JLabel.LEFT);         
        p.add(lab1 = new JLabel("User Name"));
        JTextField txt1 = new JTextField("User Name", JTextField.RIGHT);
        p.add(txt1= new JTextField());



        JLabel lab2 = new JLabel("Password ", JLabel.LEFT);            
        p.add(lab2 = new JLabel("Password"));
        JPasswordField txt2 = new JPasswordField("*****",JPasswordField.RIGHT );
        p.add(txt2 = new JPasswordField());



      //  names.add(lab1,lab2);// Not right but I want to put the label text to this arrayList
      //  values.add(txt1,txt2);// 


        add(p);
};



public static void main(String[] args) 
{


JFrame frame = new JFrame();
frame.getContentPane().add(new SampleFiveA());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible(true);


};
};

Ответы [ 3 ]

2 голосов
/ 13 мая 2011

вы можете использовать

names.add(txt1.getText());
values.add(txt2.getText());

но, возможно, вам следует подумать о лучшей структуре данных, например, HashMap и

hashmap.put(txt1.getText(),txt2.getText())

(и вы должны сделать это, основываясь на каком-то событии, например, пользователь нажимает кнопку, а не в конструкторе, иначе значение будет тем, которое вы установили ранее)

1 голос
/ 13 мая 2011

Я уверен, что вы пытаетесь сделать.Вы либо хотите поместить JLabel в ArrayList, либо текст этой метки.

Если вы хотите поместить весь JLabel в ArrayList, вы должны сделать ArrayList<JLabel>.Но я так понимаю, вы хотите получить текст из JLabel, поэтому вы должны написать names.add(lab1.getText());.

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

Вы пишете:

JLabel lab1 = new JLabel("User Name", JLabel.LEFT);         
p.add(lab1 = new JLabel("User Name"));

Но так как вы уже создаете lab1 JLabelВы можете просто написать p.add(lab1).

И последнее замечание. Я думаю, что SampleFiveA должен лучше расширять JFrame, если вы не хотите, чтобы он расширял JPanel, чтобы использовать его где-то еще.Если вам нужно, чтобы это было автономно, вы должны изменить это.

ура

1 голос
/ 13 мая 2011

Вот вам начало.

Добавляет FocusListener к текстовым полям и обеспечивает обновление содержимого ArrayList на текущее значение, когда текстовое поле теряет фокус.

import java.awt.GridLayout;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class Main extends JPanel {

    ArrayList<String> names = new ArrayList<String>(); // the text for the
                                                       // labels
    ArrayList<String> values = new ArrayList<String>(); // the initial contents
                                                        // of the text fields
    int col; // the number of columns used to set the width of each textfield

    public Main() {
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(2, 2));

        names = new ArrayList<String>();
        values = new ArrayList<String>();


        JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
        p.add(lab1);
        JTextField txt1 = new JTextField("User Name", JTextField.RIGHT);
        p.add(txt1);

        names.add(lab1.getText());
        values.add(txt1.getText());

        JLabel lab2 = new JLabel("Password ", JLabel.LEFT);
        p.add(lab2);
        JPasswordField txt2 = new JPasswordField("*****", JPasswordField.RIGHT);
        p.add(txt2);
        names.add(lab2.getText());
        values.add(txt2.getText());


        // names.add(lab1,lab2);// Not right but I want to put the label text to
        // this arrayList
        // values.add(txt1,txt2);//
        txt1.addFocusListener(new ArrayListFocusListener(txt1, values, 0));
        txt2.addFocusListener(new ArrayListFocusListener(txt2, values, 1));

        add(p);


        // Start a thread to print the content of the list for 10 seconds
        new Thread() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    System.out.println(values);
                }
            }
        }.start();


    };



    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.getContentPane().add(new Main());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);

    };

    class ArrayListFocusListener implements FocusListener {
        JTextField textField;
        ArrayList<String> backingList;
        int myIndex;

        public ArrayListFocusListener(JTextField textField,
                ArrayList<String> backingList, int myIndex) {
            this.textField = textField;
            this.backingList = backingList;
            this.myIndex = myIndex;
        }

        public void focusGained(FocusEvent e) {
        }

        @Override
        public void focusLost(FocusEvent e) {
            backingList.set(myIndex, textField.getText());
        }

    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...