【问题标题】:Using ArrayList in a JPanel在 JPanel 中使用 ArrayList
【发布时间】:2011-05-14 01:11:15
【问题描述】:

类 SampleFiveA 扩展了 JPanel。这包含文本字段,一个在另一个之下,每个在左侧都有一个标签。所有文本字段将具有相同的宽度并位于面板的右边框。 SampleFiveA 只有一个构造函数,接受以下三个参数:

ArrayList 名称, ArrayList 值, 整数列

到目前为止,我在 GUI 中创建了示例用户名密码屏幕,但现在我在 JPanel 中实现一个 ArrayList 时遇到问题,一个用于用户名,另一个用于密码。有点卡在那里几个小时现在找不到合适的例子来做到这一点。下面是我注释了我需要使用 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);


};
};

【问题讨论】:

  • 需要理解的重要一点:您不能创建 ArrayLists namesvalues 或 int cols。它们被传递到您的构造函数中,然后您将它们分配给对象自己的变量。那么,您的构造函数的签名是public SampleFiveA(ArrayList names, ArrayList values, int cols)。我不知道你在这里要达到什么目标,但我怀疑这将涉及从这些提供的列表中读取/写入。
  • 你知道如何迭代你的列表吗?如果没有,请阅读for loops

标签: java swing


【解决方案1】:

你可以使用

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

但也许你应该考虑一个更好的数据结构,例如一个 HashMap 和

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

(你应该根据一些事件来做这件事,例如用户按下一个按钮,而不是在构造函数中,否则这个值将是你之前设置的那个)

【讨论】:

【解决方案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());
        }

    }
};

【讨论】:

  • 非常感谢!!!现在我明白了为什么我无法理解这些示例,因为其中包含 ActionListners。我可以很容易地从这里开始。再次感谢。
【解决方案3】:

我确定你想要做什么。你要么想把 JLabel 放在一个 ArrayList 中,要么放在那个标签的文本中。

如果你想把整个 JLabel 放在一个 ArrayList 中,你应该创建一个ArrayList&lt;JLabel&gt;。但我认为你想从 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 以在其他地方使用它。如果你需要它是独立的,你应该改变它。

干杯

【讨论】:

  • 谢谢,我只是通过查看一些网络示例来说明的。真的不知道为什么。谢谢你的解释。
猜你喜欢
  • 2011-07-10
  • 2016-10-23
  • 1970-01-01
  • 2012-03-14
  • 2012-12-15
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多