[JAVA]Nie działa KeyLisner, przekazywanie danych do innej kl


(Duzy Rysiek) #1

witam serdecznie. piszę program “druk przelew/wpłata” ale mam dwa problemy. :confused:

  1. nie działa mi KeyLisner, tzn. napisałem metodę sprawdzającą czy wciśnięty klawisz jest cyfrą czy nie. gdy uruchamiam program i chce wpisać w polu tKwota cyfrę bądź literę to nic mi nie wpisuje. czemu tak się dzieję. . poniżej kod:

    //pole “Kwota”

     	eKwota.setBounds(350,145,50,20);
    
     	eKwota.setForeground(Color.blue);
    
     	pFormularz.add(eKwota);
    
     	tKwota.setBounds(350,165,160,20);
    
     	tKwota.setFont(new Font("Courier New",Font.BOLD,14));
    
     	tKwota.addKeyListener(this);
    
     	pFormularz.add(tKwota);
    

    private boolean czyLiczba(char znak)

     {
    
     	if (znak>=0&&znak<=9)
    
     	{
    
     	return true;
    
     	}
    
     	else
    
     	{
    
     	return false;
    
     	}
    
     }
    
     public void keyPressed(KeyEvent kE) {}
    
     public void keyReleased(KeyEvent kE) {}
    
     public void keyTyped(KeyEvent kE) 
    
     {
    
     	if(!czyLiczba(kE.getKeyChar()));
    
     	kE.consume();
    
     }
    
  2. Nie wiem jak przekazać dane wpisywane do TextField do innej klasy. dokładnie to z klasy o nazwie “Formularz” do klasy “Druk” :confused: w klasa druk rysuje druk przelewu. wiem że trzeba użyć konstruktora ale nie wiem jak to zrobić. ciężko mi to zrozumieć :confused: poniżej kawałek kodu podaję:

    private JTextField tNazwaOdbiorcy1 = new JTextField();

    public void wypelnianie()

     {
    
     	//pole "Nazwa odbiorcy"
    
     	eNazwaOdbiorcy1.setBounds(10,10,100,15);
    
     	eNazwaOdbiorcy1.setForeground(Color.blue);
    
     	pFormularz.add(eNazwaOdbiorcy1);
    
     	tNazwaOdbiorcy1.setBounds(10,25,500,25);
    
     	tNazwaOdbiorcy1.setFont(new Font("Courier New",Font.BOLD,14));
    
     	pFormularz.add(tNazwaOdbiorcy1);
    

    }

bardzo proszę o pomoc i proste wytłumaczenie i przykład jak mogę przekazać dane do innej kasy.


(Frankfurterium) #2

Nie wiem, czy walidacja przez sprawdzanie klawiatury jest najszczęśliwszym pomysłem. A jeżeli ktoś zechce wprowadzić odpowiednie wartości za pomocą myszki? Albo nie bezpośrednio, tylko przez Ctrl+V? Chyba lepiej byłoby po prostu użyć JFormattedTextField skonfigurowanego tak, żeby nie przyjmował liter albo wywoływać funkcję sprawdzającą po zakończeniu wpisywania (wciśnięciu buttona albo osiągnięciu konkretnej liczby znaków w polu tekstowym).

JTextField jest prywatny, więc żeby przekazać jego wartość poza klasę, wypadałoby utworzyć odpowiednią metodę, np.

public String gettNazwaOdbiorcy1() {

    return tNazwaOdbiorcy1.getText();

}

I jeżeli klasa, w której siedzi, jest już zainstantowana, to wtedy po prostu:

String text = instancja.gettNazwaOdbiorcy1();

(Duzy Rysiek) #3

jeśli chodzi o schowek systemowy to poradziłem sobie z nim w ten sposób :wink:

private boolean czyLiczba(char znak)

	{

		if (znak>='0'&&znak<='9')

		{

			return true;

		}

		else

		{

			return false;

		}

	}

	public void keyPressed(KeyEvent kE) 

	{

		if(kE.isControlDown() && kE.getKeyCode() == KeyEvent.VK_V)

		{

			Clipboard schowekSys = Toolkit.getDefaultToolkit().getSystemClipboard();

			DataFlavor liczba = DataFlavor.stringFlavor;

			String schowek ="";


			try 

			{

				schowek =(String)schowekSys.getData(liczba);

			} 

			catch (UnsupportedFlavorException e) 

			{

				System.out.println("to nie jest liczba ");

			} 

			catch (IOException e) {System.out.println("błąd ");}


			for (int i=0;i
			{

				if(!czyLiczba(schowek.charAt(i)))

				{

					kE.consume();

					break;

				}

			}

		}

	}

później dorobię jeszcze menu kontekstowe :wink:

Dodane 28.01.2013 (Pn) 15:36

mam jeszcze jedno pytano. jak wywołać systemowe kopiowanie/wklejanie/wycinanie dla wszystkich obiektów klasy JTextField? dokładniej to robię menu kontekstowe z takimi właśnie itemami, i gdy każdemu obiektowi klasy JTextField daje opcje copy/paste/cut to dana operacja wykonuje się dla każdego obiektu,

a ma być tylko w danej chwili dla jednej gdzie ta operacja jest wywoływana.

co w pisać w actionPerformed? :expressionless: