2011-05-13 36 views
0

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

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); 


}; 
}; 
+1

需要了解的重要事项:您无法创建ArrayLists'name','values'或int'cols'。它们被传递给你的构造函数,然后将它们分配给你的对象自己的变量。然后,您的构造函数的签名是'public SampleFiveA(ArrayList names,ArrayList values,int cols)'。我不知道你在这里需要达到什么目的,但我怀疑它会涉及到从这些提供的列表中读/写。 – Doug 2011-05-13 16:54:17

+0

你知道如何迭代你的列表吗?如果没有,请阅读[for loops](http://www.java-tips.org/java-se-tips/java.lang/the-enhanced-for-loop.html)。 – Jeremy 2011-05-13 16:54:25

回答

1

这里有一个为你开始。

它向文本字段添加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()); 
     } 

    } 
}; 
+0

非常感谢!现在我明白为什么我无法理解包含ActionListners的示例。我可以轻松地从这里开始。再次感谢。 – Splitter 2011-05-13 17:11:28

2

可以使用

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

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

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

(你应该基于某些事件做到这一点,例如,用户按下一个按钮,而不是在构造函数中,否则该值将是你之前设置了一个)

+0

看看http://download.oracle.com/javase/tutorial/uiswing/examples/components/TextDemoProject/src/components/TextDemo.java – rurouni 2011-05-13 17:00:51

+0

谢谢你!是的,我应该先实现一些按钮,然后从那里开始。 – Splitter 2011-05-13 17:08:57

1

我确定你在做什么。您要么将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")); 

但既然你已经创建JLabel的lab1中,你可以只写p.add(lab1)

最后我注意到,我认为SampleFiveA应该更好地扩展JFrame,除非您希望它扩展JPanel以在其他地方使用它。如果你需要它是独立的,你应该改变它。

欢呼声

+0

谢谢我只是通过查看一些网页样本来放置它。 Did not真的知道为什么。感谢您的解释。 – Splitter 2011-05-13 17:30:30