[Pyt Swing] getText nie działa

0

Witam
To jest dalsza cześć moich problemów dotyczących http://4programmers.net/Forum/viewtopic.php?id=157666
Przed umieszczeniem danych z JTextField w bazie danych, chciałem móc "je uzyskać" choćby do tego aby móc sprawdzić czy będą mieścić się w założonym przeze mnie zakresie. Ale nie mogę nawet odczytać ich w oknie dialogowym, a co dopiero sprawdzić. Może ktoś mi powie dlaczego? Będę jak zawsze bardzo wdzięczny za każdą pomoc.
Oto kod:



import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.*;

public class Baza_wypelnianie {

  private JPanel mainPanel = new JPanel();
  private JTextField textFields = new JTextField();
  ActionListener listener;
  private JTextField infoTxt=new JTextField();
  private JButton tabInfo = new JButton("Info");
  String[] arr = new String [10];
  Connection conn,conn2 = null;
  Statement stmt,stmt2 = null;
  ResultSet rs,rs2 = null;
	
	
  public static Connection getConnection() throws Exception {
  	String driver = "org.apache.derby.jdbc.ClientDriver";
  	String url = "XXXX";
  	String username = "XX";
  	String password = "XX";
  	Class.forName(driver);
  	return DriverManager.getConnection(url, username, password);
  }
  
  
  public Baza_wypelnianie() {
    JPanel fieldPanel = new JPanel(new GridLayout(2,2, 10, 10));
    FocusListener focusListener = new MyFocusAdapter();
    try {            
        conn = getConnection();
	    stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
	   
	    try{		      
			String query2 = "SELECT * FROM TEST";	    	
			 rs = stmt.executeQuery(query2);
		        ResultSetMetaData md = rs.getMetaData();
		        int col = md.getColumnCount();		   
		        rs.next();
		        for (int i = 1; i < col+1; i++)		     
		        {		    
		        	
		        	 String textFieldName = rs.getString(i);
		             textFields = new JTextField(5);
		             textFields.setName(md.getColumnName(i));
		             textFields.addFocusListener(focusListener);		             
		             JLabel label = new JLabel(textFieldName);
		             JPanel p = new JPanel();
		             p.add(label);
		             p.add(textFields);
		             textFields.addActionListener(listener);
		             fieldPanel.add(p);	    
		        }  
		      }
		      catch (SQLException s){
		        System.out.println("SQL statement is not executed!");
		      }



    infoTxt.setEditable(false);
    infoTxt.setFocusable(false);
    
    mainPanel.setLayout(new BorderLayout());
    mainPanel.add(fieldPanel, BorderLayout.NORTH);
    JPanel southPanel=new JPanel();
    southPanel.setLayout(new GridLayout(1,2));
    southPanel.add(infoTxt);
    southPanel.add(tabInfo);
    mainPanel.add(southPanel, BorderLayout.CENTER);

    tabInfo.addActionListener(new ActionListener() {  	 

    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		 String s= textFields.getText();
//juz poprawione, ale tak czy inaczej tutaj właśnie coś jest nie tak!
       	   JOptionPane.showMessageDialog(null, s, "Wpisano", JOptionPane.INFORMATION_MESSAGE);;
          }
    	});  
    
    }
    catch (Exception e) {
	    e.printStackTrace();
	    System.exit(1);
        
	} finally {
	    // release database resources
	    try {
		rs.close();
		stmt.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	    }
  }

  public JComponent getPanel() {
    return mainPanel;
  }

  private class MyFocusAdapter extends FocusAdapter {
    public void focusGained(FocusEvent e) {
      infoTxt.setText(((JTextField) e.getSource()).getName());
    
    
  }

}
  private static void createAndShowGUI() {
    JFrame frame = new JFrame("Test Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new Baza_wypelnianie().getPanel());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}


Pobieranie nazwy JTextField, oraz nazwy z pierwszego wiersza bazy danych jako tekstu JLabel - działa, a chciałbym jeszcze żeby sprawdzało czy wpisana wartość w JTextField jest większa od wartości z wiersza drugiego bazy danych a mniejsza niż wartość w wierszu trzecim. Stąd muszę nauczyć się wydostawać wartości z JTextField które wpisał użytkownik.
samo getText() wyświetla jedynie puste okno dialogowe,
a ((JTextField) e.getSource()).getText() zgłasza błąd.

0

w tym miejscu nie wiem jakiego listenera podajesz

textFields.addActionListener(listener);

a tu niewidze impl "cosTxt"

tabInfo.addActionListener(new ActionListener() {           

            @Override
            public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                     String s= cosTxt.getText();
                  JOptionPane.showMessageDialog(null, s, "Wpisano", JOptionPane.INFORMATION_MESSAGE);;
          }
            });  
    
    }
0

Nadawaj zmiennym prawidłowo nazwy, to nie będzie miał kłopotów.

To właśnie "COŚ" jest problemem...

0

już poprawiony kod. Faktycznie to COŚ powstało w wyniku szybkości w pisaniu posta przed wyjściem. Bardzo przepraszam za zamieszanie. Ale to nie to COS było problemem.
Tak czy inaczej pojawia się okno dialogowe bez "niczego".
Proszę jeszcze raz zerknąć, co może być nie tak.

0

No to zaprzęgnij do akcji debugger i Ci powie co jest nullem...

0

wydaje mi się że problem dotyczy właśnie textFields
bo przy nasłuchiwaniu zaznaczenia tj

  private class MyFocusAdapter extends FocusAdapter {
    public void focusGained(FocusEvent e) {
      infoTxt.setText(((JTextField) e.getSource()).getName());
   
   
  }

}

nie wykorzystano bezpośrednio textFields tyko JTextFields

a w tym przypadku tj.

            public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                     String s= textFields.getText();
//juz poprawione, ale tak czy inaczej tutaj właśnie coś jest nie tak!
                  JOptionPane.showMessageDialog(null, s, "Wpisano", JOptionPane.INFORMATION_MESSAGE);;
          }
            });  

(JTextField) e.getSource()).getText()
jak już mówiłem zgłasza błąd, a textFields.getText() daje rezultat null i wyświetla puste okno dialogowe

user image

0

pobierasz wartość po naciśnięciu guzika z ostatniego utworzonego JTextField, czyli w twoim przypadku ostatnia kolumna.

Jeśli chcesz pobierać wartość to utwórz listę List<JTextField> przy tworzeniu ich i po naciśnięciu przycisku przeszukuj listę pod względem nazwy lub kolejność elementów będzie odpowiadać kolejnym kolumnom

0

ale nadal nie wiem dlaczego konstrukcja

  tabInfo.addMouseListener(new MouseAdapter() {          

            public void mouseClicked(MouseEvent e) {
           String s= textFields.getText();
                  JOptionPane.showMessageDialog(null, s, "Wpisano", JOptionPane.INFORMATION_MESSAGE);;
          }
            }); 

daje wartość null??? Zważywszy że przecież zapis jest prawidłowy, bo normalnie działa.

0

napisałem dlaczego:

pobierasz wartość po naciśnięciu guzika z ostatniego utworzonego JTextField, czyli w twoim przypadku ostatnia kolumna.

a tu masz poprawiony kod, porównaj ze swoim:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.swing.*;

public class Baza_wypelnianie {

	private JPanel mainPanel = new JPanel();
	//private ActionListener listener;
	private Connection conn = null;
	private Statement stmt = null;
	private ResultSet rs = null;

	public static Connection getConnection() throws Exception {
		String driver = "org.apache.derby.jdbc.ClientDriver";
		String url = "XXXX";
		String username = "XX";
		String password = "XX";
		Class.forName(driver);
		return DriverManager.getConnection(url, username, password);
	}

	public Baza_wypelnianie() {
		JPanel fieldPanel = new JPanel(new GridLayout(2, 2, 10, 10));

		JLabel infoTxt = new JLabel();
		FocusListener focusListener = new MyFocusAdapter(infoTxt);
		List<JTextField> listTextFields = new LinkedList<JTextField>();
		JButton tabInfo = new JButton("Info");
		tabInfo.addActionListener(new MyActionListener(listTextFields));

		try {
			conn = getConnection();
			stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

			try {
				String query2 = "SELECT * FROM TEST";
				rs = stmt.executeQuery(query2);
				ResultSetMetaData md = rs.getMetaData();
				int col = md.getColumnCount();
				rs.next();
				for (int i = 1; i < col + 1; i++) {

					String textFieldName = rs.getString(i);
					JTextField textFields = new JTextField(5);
					listTextFields.add(textFields);
					textFields.setName(md.getColumnName(i));
					textFields.addFocusListener(focusListener);
					JLabel label = new JLabel(textFieldName);
					JPanel p = new JPanel();
					p.add(label);
					p.add(textFields);
					//textFields.addActionListener(listener);
					fieldPanel.add(p);
				}
			} catch (SQLException s) {
				System.out.println("SQL statement is not executed!");
			}

			mainPanel.setLayout(new BorderLayout());
			mainPanel.add(fieldPanel, BorderLayout.NORTH);
			JPanel southPanel = new JPanel();
			southPanel.setLayout(new GridLayout(1, 2));
			southPanel.add(infoTxt);
			southPanel.add(tabInfo);
			mainPanel.add(southPanel, BorderLayout.CENTER);
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		} finally {
			// release database resources
			try {
				rs.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public JComponent getPanel() {
		return mainPanel;
	}

	private class MyFocusAdapter extends FocusAdapter {

		private JLabel infoTxt;

		public MyFocusAdapter(JLabel infoTxt) {
			this.infoTxt = infoTxt;
		}

		@Override
		public void focusGained(FocusEvent e) {
			infoTxt.setText(((JTextField) e.getSource()).getName());


		}
	}

	private class MyActionListener implements ActionListener {

		private List<JTextField> listTextFields;

		public MyActionListener(List<JTextField> listTextFields) {
			this.listTextFields = listTextFields;
		}

		public void actionPerformed(ActionEvent e) {
			String s = "";
			for (Iterator<JTextField> it = listTextFields.iterator(); it.hasNext();) {
				JTextField tf = it.next();
				s += tf.getName() + " = \"" + tf.getText() + "\"\n";
			}
			JOptionPane.showMessageDialog(null, s, "Wpisano", JOptionPane.INFORMATION_MESSAGE);
		}
	}

	private static void createAndShowGUI() {
		JFrame frame = new JFrame("Test Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(new Baza_wypelnianie().getPanel());
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				createAndShowGUI();
			}
		});
	}
}

0

Ciężki napisałeś kod.

Masz złe nazewnictwo, najpierw tworzysz pole klasy, typu JTextField, które nazywasz textFields.
Sugeruję tak nazywać swoje kolekcje/tablice. Potem tworzysz zmienne lokalne o tej samej nazwie. Poza tym dlaczego nie używasz operatora this, żeby wskazać czy odwołujesz się do pola klasy, czy zmiennej lokalnej. Generalnie jest duży bałagan w Twym kodzie, a bałagan zwykle rzadko działa poprawnie.

Poza tym rzeczy nazywaj po imieniu, czyli przycisk wyświetlający nazywa się infoButton, czy jakoś tak, a na pewno nie tabInfo...

Jeśli dobrze rozumiem to co chcesz osiągnąć, powinieneś do wyświetlanie tego typu danych, używać tabeli.

Po co Ci MouseListener na obiekcie JButton, zostaw ActionListener.

Musisz w nim określić z którego pola chcesz pobrać dane i wyświetlić.
Nie rozumiem dobrze Twojego problemu, wg mnie powinna to być tabela, w której wskazujesz wybrany rekord do edycji i tym samym otwierasz okno (JDialog) z wartościami wiersza tej tabeli zapisanymi w JTextField-ach.

Pierwszy pomysł, przeróbka Twojego, może tak:

   class EntityRowEditor extends JDialog {
    
         private List<JTextField> textFields = new ArrayList<JTextField>();
         private List<String> validationErrors = new ArrayList<String>();
       
         //EntityRow - jego dane to wiersz tabeli
         public EntityRowEditor(EntityRow row) {
                     this.textFields.add(createJTextField(row.getFieldAValue(), 'FieldA');
                     this.textFields.add(createJTextField(row.getFieldBValue(), 'FieldB');
                    // itd
         }

         private function validate() {
                  for (JTextField field : this.textFields) {
                             String fieldName = field.getName();
                              int min;
                              int max;
                             switch(fieldName) {
                                    case 'FieldA': min = 10; max = 30; break;

                                    case 'FieldB': min = 5; max = 20; break;
                             }
                             checkFieldValueLengthRange(min, max, field);
                  }
                  if (this.validationErrors.size() > 0) return false;
                  return truel
         }

         private function checkFieldValueLengthRange(int minRange, int maxRange, JTextField field) {
                    String value = field.getText();
                    int length = value.length();
                    if ( length > maxRange || length < minRange) 
                                   //dodanie błędu.
                                   
         }

         private JTextField createJTextField(fieldValue, fieldName) {
                   JTextField field = new JTextField(fieldValue);
                   field.setName(fieldName);
                   return field;
         }
    }

0

Dziękuje bardzo za odpowiedzi.

Wiem, bałagan w kodzie!! [glowa] Ale ja naprawdę dopiero się uczę i w październiku pierwszy raz kod Java na oczy zobaczyłem. Nigdy wcześniej nie programowałem, a jak kiedyś wspominałem nie mam 16, czy 18 lat więc szare komórki też tak nie działają ;-) hahaha

A tak poważnie podjąłem się dość sporego projektu i to za darmo. Ale nic nie uczy tak jak setki, tysiące godzin spędzone nad czymś konkretnym, a stworzenie programu do wpisywania danych z ankiety jest już dość konkretnym programem. Wymyśliłem sobie, aby nie wpisywać bezsensownie w kod programu treści pytań i możliwych zakresów, że moja baza danych będzie wyglądać następująco:

  1. Nazwa kolumn-będą pobierane z niej nazwy i te nazwy tworzyć będą nazwy poszczególnych JTextField, aby wyświetlając się w rogu programu, była możliwa łatwa identyfikacja poszczególnego rekordu w bazie danych (np znając jakieś ID ankiety i nazwę kolumny bez problemu znajdujemy szukaną i interesującą nas wartość).
  2. Pierwszy wiersz - tu będzie treść pytań, czyli inaczej: wezmę ten tekst i przypiszę do JLabel. Tym sposobem mam treść pytania do odpowiedniego JTextField
  3. Drugi wiersz - wartość minimalna (dane ankietowe będą w postaci kodów....raczej tekstu chyba nie będzie)
  4. Trzeci wiersz - wartość maksymalna
  5. Czwarty i kolejne wiersze- kolejno wpisywane dane ankietowe.

Tak to wszystko wygląda. Mam nadzieje że już wiecie po co tak was męczyłem. Po prostu się uczę! ;-)
Nazwa kol1 |Nazwa kol2

treść Pyt1 | treść Pyt2
wart Min1 | wart Min2
wart Max1 | wart Max2
kolejne odpowiedzi pytań

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