Использование ArrayList в JPanel

#java #swing

#java #swing

Вопрос:

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

Имена ArrayList, значения ArrayList, столбцы int

До сих пор я создавал пример экрана ввода имени пользователя и пароля в графическом интерфейсе, но теперь у меня возникла проблема с реализацией 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);


};
};
  

Комментарии:

1. Важно понимать: вы не можете создавать ArrayLists names , values или int cols . Они передаются в ваш конструктор, а затем вы присваиваете их собственным переменным вашего объекта. Подпись вашего конструктора, таким образом, является public SampleFiveA(ArrayList names, ArrayList values, int cols) . Я не знаю точно, чего вы должны здесь достичь, но я подозреваю, что это будет включать чтение / запись из этих предоставленных списков.

2. Знаете ли вы, как выполнять итерации по вашим спискам? Если нет, прочитайте о циклах for .

Ответ №1:

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

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

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

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

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

Комментарии:

1. взгляните на download.oracle.com/javase/tutorial/uiswing/examples/components /…

2. Спасибо за это!!! Да, я должен сначала реализовать некоторые кнопки, а затем начать оттуда.

Ответ №2:

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

Это добавляет 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());
        }

    }
};
  

Комментарии:

1. Большое спасибо!!! Теперь я понимаю, почему я не мог понять примеры, поскольку там были включены ActionListners. Я могу легко начать отсюда. Еще раз спасибо.

Ответ №3:

Я уверен, что вы пытаетесь сделать. Вы хотите либо поместить 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. спасибо, я просто изложил это, просмотрев несколько веб-примеров. На самом деле не знал, почему. Спасибо за объяснение.