2011-05-13 2 views
0

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

имен 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 'names',' values', или Int 'cols'. Они передаются в ваш конструктор, а затем вы назначаете их собственным переменным объекта. Таким образом, ваша подпись конструктора является 'public SampleFiveA (имена ArrayList, значения ArrayList, int cols)'. Я не знаю точно, что вы должны здесь достичь, но я подозреваю, что это будет включать чтение/запись из этих предоставленных списков. – Doug

+0

Знаете ли вы, как перебирать списки? Если нет, прочитайте о [для циклов] (http://www.java-tips.org/java-se-tips/java.lang/the-enhanced-for-loop.html). – Jeremy

ответ

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

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

+0

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

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

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

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

веселит

+0

спасибо, я просто положил его, посмотрев на некоторые веб-образцы. Не знал почему. Спасибо за объяснение. – Splitter

Смежные вопросы