Dodawanie nowych uzupełnionych pól tekstowych po odczytaniu pliku

0

Witam,
w ramach nauki obsługi gui w Javie mam pytanie - w jaki sposób mogę modyfikować zawartość już stworzonego okna? Otóż chciałbym uzupełniać kolejne pola JTextField kolejno odczytanymi z pliku liniami.
W kodzie wygląda to tak:

// konstruktor tworzący panel z 15 polami
public Window() {
		// kod trochę wyrwany z kontekstu
		JPanel idPanel = new JPanel(new BorderLayout(3,3));
        JPanel inIdPanel = new JPanel(new GridLayout(0,1));
        JScrollPane scrollId = new JScrollPane(inIdPanel);
        scrollId.setPreferredSize(new Dimension(100,250));
        idPanel.add(new JLabel("Pola tekstowe"));
        idPanel.add(scrollId, BorderLayout.SOUTH);
        for(int i=0; i<15; i++) {
                inIdPanel.add(new JTextField());
        }
		FlowLayout flowLayoutLg = new FlowLayout();
		flowLayoutLg.setAlignment(FlowLayout.LEFT);
		getContentPane().setLayout(flowLayoutLg);
		JPanel jp = new JPanel();
		jp.setBorder(new TitledBorder("Pola"));
		jp.add(idPanel);
						// przycisk do wybrania pliku
						wczytaj.addActionListener(new OpenL());
						dir.setEditable(false);
						fileName.setEditable(false);
		jp.add(wczytaj);
		add(jp);
}

A tutaj klasa odczytująca plik:

class OpenL implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JFileChooser c = new JFileChooser();
			int rVal = c.showOpenDialog(Window.this);
			if(rVal == JFileChooser.APPROVE_OPTION) {
				fileName.setText(c.getSelectedFile().getName());
				dir.setText(c.getCurrentDirectory().toString());
				
				String linia = null;
                File plik = c.getSelectedFile();
    			try {
					BufferedReader bufPlik = new BufferedReader(new FileReader(plik));
					while( (linia = bufPlik.readLine()) != null) {
						// pomocniczo wyswietlenie kolejnych linii w konsoli
						System.out.println(linia);
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			if(rVal == JFileChooser.CANCEL_OPTION) {
				fileName.setText("ANULOWANO");
				dir.setText("");
			}
		}
	}

wszystko później uruchamiam tak:

	public static void main(String[] args) {
		// utworzenie okna
		run(new Window(), 550, 600);
	}

jak to zrobić by po wczytaniu pliku pętla:
for(int i=0; i<iloscLiniiWPliku; i++) {
inIdPanel.add(new JTextField(odczytanaLiniaZPliku));
}
spełniała swoją rolę? (tj. tworzyła odpowiednią ilość JTextField z uzupełnionym tekstem z odczytanych linii).

mam nadzieję że w miarę jasno wytłumaczyłem. proszę o pomoc.

0

Zazwyczaj wystarczy wywołać (po dodaniu komponentów) metody validate() i repaint(). Po co Ci takie sztuczki, nie prościej wyświetlić zawartość pliku w jednym JTextArea?

0

Musi być JTextField i każda linia z pliku w nowym polu. A jak (i gdzie) wywołać te metody o których piszesz? podałbyś kawałek kodu jak to zrealizować?
jestem bardzo początkującym jeśli chodzi o okienka w javie...

0

Jakoś tak.

class OpenL implements ActionListener {
     public void actionPerformed(ActionEvent e) {
          JFileChooser c = new JFileChooser();
          int rVal = c.showOpenDialog(Window.this);
          if(rVal == JFileChooser.APPROVE_OPTION) {
               fileName.setText(c.getSelectedFile().getName());
               dir.setText(c.getCurrentDirectory().toString());
 
               String linia = null;
               File plik = c.getSelectedFile();
               try {
                    BufferedReader bufPlik = new BufferedReader(new FileReader(plik));
                    while( (linia = bufPlik.readLine()) != null) {
                          // pomocniczo wyswietlenie kolejnych linii w konsoli
                          System.out.println(linia);
                          inIndPanel.add(new JTextField(linia));
                    }
                    inIdPanel.validate();
                    inIdPanel.repaint();
               } catch (Exception e1) {
                      e1.printStackTrace();
               }
           }
           if(rVal == JFileChooser.CANCEL_OPTION) {
               fileName.setText("ANULOWANO");
               dir.setText("");
           }
       }
   }
0

dzięki, już sobie z tym poradziłem. tylko teraz mam kolejny problem :D
kiedy mam już uzupełnione te pola tekstowe to można w nich po wczytaniu coś edytować. i teraz pytanie - jak mogę zebrać to co jest w tych polach do dalszego przetworzenia? tzn. jak mógłbym "wyłuskać" ich zawartość i zapakować np. do jakiejś tablicy/listy?

0

Zdefiniuj pole w klasie

ArrayList<JTextField> pola = new ArrayList<JTextField>();
//zmień trochę pętlę tworzącą pola tekstowe
JTextField tf = new JTextField(linia);
inIndPanel.add(tf);
pola.add(tf);
//poskładać do kupy wynik edytowania tych pól możesz tak:
StringBuilder sb = new StringBuilder("");
for (JTextField tf: pola)
{
   sb.append(tf.getText()+"\n")
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1