KeyListener implements Runnable

Status
Nicht offen für weitere Antworten.

Phaxx

Mitglied
Hallo, habe eine Frage zu folgendem Code:

Code:
public String readLine() throws InterruptedException{
	input.setEnabled(true); //input ist ein JTextField
	Thread keyListener = new Thread(new InputKeyListener());
	keyListener.join();
	input.setEnabled(false);
	return in;
}
Code:
class InputKeyListener extends KeyAdapter implements Runnable{
	public void keyPressed(KeyEvent ke){
		if(ke.getKeyCode()==KeyEvent.VK_ENTER){
			in = input.getText();
			input.setText("");
		}else if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
			System.exit(1);
		}
	}
	
	public void run(){
		input.addKeyListener(this);
	}
}
Wobei InputKeyListener eine innere Klasse von der Klasse ist, welche auch public String readLine() beinhaltet.

Jetzt erwarte ich, dass die Methode readLine() den Text zurückgibt, welcher im JTextField input eingegeben und mit ENTER abgeschlossen wird...
Allerdings wird null zurückgegeben...

Kann mir das jemand erklären?
 
B

Beni

Gast
1. startest du diesen Thread nie Thread#start
2. würde das nichts nützen, weil der Thread schnell fertig ist (KeyListener hinzufügen und weg...)

Du köntest ein Paar Object#wait und Object#notify oder Thread#sleep und Thread#interrupt verwenden, aber dann muss das readLine in einem eigenen Thread ablaufen.

Als Versuch:
Code:
readLine(){
  final Object LOCK = new Object();
  InputKeyListener input = InputKeyListener( LOCK );

  try{
    synchronized( LOCK ){
      LOCK.wait();
    }
  }
  catch( InterruptedException ex ){}

  return in;
}

Code:
   public void keyPressed(KeyEvent ke){
      if(ke.getKeyCode()==KeyEvent.VK_ENTER){
         in = input.getText();
         input.setText("");

         synchronized( LOCK ){
            LOCK.notify();
         }
   }

Habs aber nicht getestet!

mfg Beni
 

Phaxx

Mitglied
Geht leider nicht, oder ich weiss nicht genau, wie du's meinst...

Die Methode keyPressed(KeyEvent ke){} ist in deinem Beispiel auch in einer eigenen Klasse InputKeyListener? Aber die ist nicht mehr "runnable", richtig? Wenn ja, dann gibts ein Problem bei
Code:
InputKeyListener input = InputKeyListener(LOCK);
Da meldet er: "This method InputKeyListener(Object) is undefined for the type Hauptklasse"

Wenn ich da schreibe:
Code:
InputKeyListener input = new InputKeyListener(LOCK);
dann gibts natürlich einen Fehler, weil es keinen entsprechenden Konstruktor gibt...

Oder verstehe ich dich jetzt grundsätzlich falsch?
 
B

Beni

Gast
Hier ist ein Beispiel, wie ich das gemeint habe:
Code:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Main{
    public static void main(String[] args){
        new Main();
    }
    
    private JFrame frame;
    private JTextField field;
    
    public Main(){
        frame = new JFrame( "Ich bin ein JFrame!" );
        frame.setBounds( 50, 50, 300, 100 );
        
        field = new JTextField();
        
        Object lock = new Object();
        Reader reader = new Reader( lock );
        InputKeyListener list = new InputKeyListener( lock );
        field.addKeyListener( list );
        
        frame.getContentPane().add( field );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        
        reader.start(); // Den Thread starten, der schlussendlich "readLine" aufrufen wird.
    }
    
    public String readLine( Object lock ){
        frame.setVisible( true );
        
        synchronized( lock ){
            try {
                lock.wait();
            } catch (InterruptedException e) {
                // silent
            }
        }
        
        frame.setVisible( false );
        return field.getText();
    }
    
    private class Reader implements Runnable{
        private Object lock;
        
        public Reader( Object lock ){
            this.lock = lock;
        }
        
        public void start(){
            new Thread( this ).start();
        }
        
        public void run(){
            System.out.println( "Thread gestartet" );
            System.out.println( "Line: " + readLine( lock ));
            System.out.println( "Thread beendet" );
        }
    }
    
    private class InputKeyListener extends KeyAdapter{
        private Object lock;
        
        public InputKeyListener( Object lock ){
            this.lock = lock;
        }
        
        public void keyPressed(KeyEvent ke){
            if(ke.getKeyCode()==KeyEvent.VK_ENTER){
               synchronized( lock ){
                   lock.notify();
               }
            }else if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
               System.exit(1);
            }
         } 
    }
}

mfg Beni
 

Phaxx

Mitglied
Also erstmals danke für dein Beispiel. Habe nun stundenlang rumprobiert und versucht, das ganze in mein Projekt einzugliedern, es will mir aber einfach nicht so ganz gelingen... Hier mal mein Code (ich weiss, ist ein wenig umfangreich):

Code:
/*
 * Created on 22.04.2004
 */
package Console;

/**
 * @author Michael Rechberger
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Console extends JFrame{
	Dimension screen;
	private JLabel output;
	private JTextField input;
	private String in;
	private Object lock;
	private Reader reader;
	private InputKeyListener list;
	
	
	public Console(int width, int height, String title){
		//JFrame erstellen
		super(title);
		screen = Toolkit.getDefaultToolkit().getScreenSize();
		setSize(width, height);
		setLocation(	(screen.width - getSize().width)/2,		//JFrame zentrieren
						(screen.height - getSize().height)/2 );
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Container erstellen und Layout zuweisen
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		//JLabel erstellen
		output = new JLabel("<html></html>");
		JScrollPane scrollableOutput = new JScrollPane(output);
		c.add(scrollableOutput,BorderLayout.CENTER);
		output.setVerticalAlignment(JLabel.TOP);
		
		//JTextField erstellen
		input = new JTextField();
		c.add(input,BorderLayout.SOUTH);
		input.setEnabled(false);
		
		//Object erstellen für Mutlithreading
		//lock = new Object(); 
		//list = new InputKeyListener( lock );
		//input.addKeyListener(list);
		setVisible(true);
	}
	
	public Console(int width, int height){
		this(width,height,"Java Console");
	}
	
	public Console(){
		this(800,600);
	}
	
	public String readLine(){
		
		lock = new Object();
		list = new InputKeyListener( lock );
		input.addKeyListener(list);	
		reader = new Reader ( lock );

		
		//reader.start();
		
		println(in = input.getText());
		System.out.println(input.getText());
		input.setText("");
	
		return in;
	}
	
	public void read( Object lock ){
		input.setEnabled(true);
		System.out.println("1");
		synchronized( lock ){
			try{
				lock.wait();
			}catch (InterruptedException ex){
				System.out.println("wait interrupted");
			}
		}
		//input.setEnabled(false);
		}
	
	public void print(String Text){
		if(Text.equals("exit")){
			System.exit(0);
		}
		output.setText(output.getText().substring(0,output.getText().length()-7)+ Text + "</html>");
	}
	
	public void println(String Text){
		if(Text.equals("exit")){
			System.exit(0);
		}
		output.setText(output.getText().substring(0,output.getText().length()-7)+ Text + "
</html>");
	}
	
	public void println(){
		output.setText(output.getText().substring(0,output.getText().length()-7) + "
</html>");
	}

	private class InputKeyListener extends KeyAdapter{
		private Object lock;
		
		public InputKeyListener (Object lock){
			this.lock = lock;
		}
		
		public void keyPressed(KeyEvent ke){
			if(ke.getKeyCode()==KeyEvent.VK_ENTER){
				in = input.getText();
				synchronized(lock){
					lock.notify();
				}
			}else if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
				System.exit(1);
			}
		}
	}
	
	private class Reader implements Runnable{
		private Object lock;
		
		public Reader (Object lock){
			this.lock = lock;
			this.start();
		}
		
		public void start (){
			new Thread ( this ).start();
		}
		
		public void run (){
			read( lock );
		}
	}
}

Was ich hier eigentlich machen möchte, ist eine Swing-basierte Konsole. Ich weiss, macht nicht viel Sinn, mach dies aber einfach als kleine Übung. Nun möchte ich von das ganze so aufrufen können:
Code:
public class Main {
	public static void main(String[] args) throws IOException, InterruptedException{
		Console console = new Console();
		
		String in = console.readLine();
		console.println(in);
	}
}

Nun weiss ich nicht recht, wo ich jetzt in meiner Console-Class dass thread.wait() hinsetzen muss. Habe vieles versucht, aber habe es nie wirklich geschafft.

Zudem ist mir nicht ganz klar wie das mit dem Object lock funktioniert. Verstehe ich das richtig, wenn das einfach ein "Pseude-Object" ist, womit ich den Thread eindeutig ansprechen kann? Habe es auch in Tutz nachgelesen, meine Fragen wurden aber nicht wirklich geklärt.

Danke
Phaxx
 
B

Beni

Gast
Die Klasse "Reader" hab ich rausgeworfen, der Rest praktisch 1:1 übernommen.
Hat das jetzt das Verhalten, dass du dir wünschst?
Code:
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

import javax.swing.*;

public class Console extends JFrame{
   Dimension screen;
   private JLabel output;
   private JTextField input;
   private String in;
   private Object lock;
   private InputKeyListener list;
   
   public static void main(String[] args) throws IOException, InterruptedException{
       Console console = new Console();
       
       for( int i = 0; i < 5; i++ ){
           console.println( i + ": Geben sie bitte etwas ein..." );
           String in = console.readLine();
           console.println( "Sie haben geschrieben: " + in);
       }
    } 
   
   public Console(int width, int height, String title){
      //JFrame erstellen
      super(title);
      screen = Toolkit.getDefaultToolkit().getScreenSize();
      setSize(width, height);
      setLocation(   (screen.width - getSize().width)/2,      //JFrame zentrieren
                  (screen.height - getSize().height)/2 );
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      //Container erstellen und Layout zuweisen
      Container c = getContentPane();
      c.setLayout(new BorderLayout());
      
      //JLabel erstellen
      output = new JLabel("<html></html>");
      JScrollPane scrollableOutput = new JScrollPane(output);
      c.add(scrollableOutput,BorderLayout.CENTER);
      output.setVerticalAlignment(JLabel.TOP);
      
      //JTextField erstellen
      input = new JTextField();
      c.add(input,BorderLayout.SOUTH);
      input.setEnabled(false);
      
      //Object erstellen für Mutlithreading
      lock = new Object();     // <<<<<<<<<<<<<<<<<<<< die wieder hinein
      list = new InputKeyListener( lock );
      input.addKeyListener(list);
      setVisible(true);
   }
   
   public Console(int width, int height){
      this(width,height,"Java Console");
   }
   
   public Console(){
      this(800,600);
   }
   
   public String readLine(){
      
      //lock = new Object();  // <<<<<<<<<<<<<<<<<<<< die raus
      //list = new InputKeyListener( lock );
      //input.addKeyListener(list);   
      
      //reader.start();
      read( lock ); // <<<<<<<<<<<<<<<<<<<<<<<<<<<< hier aufrufen
      
      println(in = input.getText());
      System.out.println(input.getText());
      input.setText("");
   
      return in;
   }
   
   public void read( Object lock ){
      input.setEnabled(true);
      System.out.println("1");
      synchronized( lock ){
         try{
            lock.wait();
         }catch (InterruptedException ex){
            System.out.println("wait interrupted");
         }
      }
      input.setEnabled(false);
    }
   
   public void print(String Text){
      if(Text.equals("exit")){
         System.exit(0);
      }
      output.setText(output.getText().substring(0,output.getText().length()-7)+ Text + "</html>");
   }
   
   public void println(String Text){
      if(Text.equals("exit")){
         System.exit(0);
      }
      output.setText(output.getText().substring(0,output.getText().length()-7)+ Text + "
</html>");
   }
   
   public void println(){
      output.setText(output.getText().substring(0,output.getText().length()-7) + "
</html>");
   }

   private class InputKeyListener extends KeyAdapter{
      private Object lock;
      
      public InputKeyListener (Object lock){
         this.lock = lock;
      }
      
      public void keyPressed(KeyEvent ke){
         if(ke.getKeyCode()==KeyEvent.VK_ENTER){
            in = input.getText();
            synchronized(lock){
               lock.notify();
            }
         }else if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
            System.exit(1);
         }
      }
   }
}

mfg Beni
 

Phaxx

Mitglied
Juhuuu! Wunderbar! Vielen Dank...

Jetzt nochmals eine Frage zum Object lock. Sehe ich das richtig, wenn dieses einfach als Object gebraucht wird, welches in diesem Thread läuft. Mit lock.wait() wird dann dieser Thread angewiesen zu warten, bis mit [ENTER] der Thread mit notify wieder geweckt wird?

Das ganze läuft also in einem einzigen Thread ab?

Wenn das so stimmt, wieso kann ich nicht anstelle vom Object lock mit "this" arbeiten? Habs versucht, ging aber nicht, oder ich habs falsch gemacht.
 
B

Beni

Gast
Grundsätzlich hast du alles verstanden.

Allerdings sind es immer noch zwei Threads: einer der durch die Main-Methode kommt, und der AWT-Thread, der für alle GUI-Elemente zuständig ist.

Es wäre schon möglich, this zu benutzen, aber dann besteht die (nicht zu unterschätzende) Gefahr, dass sonst noch jemand "wait" und/oder "notify" benutzt (oder auch "synchronized", was eine ähnliche Wirkung hat), und das würde doch einen ziemlichen Durcheinander erzeugen.

mfg Beni
 

Phaxx

Mitglied
Hmm... dann hab ich's glaub trotzdem noch nicht ganz verstanden... :roll: :)
Also, das Object lock und die console laufen ja im selben Thread, oder?

Und .wait() bezieht sich doch auf den Thread, nicht auf's Object, nicht? Aber dann hätte ja this.wait() und lock.wait()grundsätzlich dieselbe Wirkung, nämlich dass der Thread, welcher diese beide Objects beinhaltet in die Pause geschickt wird...?

Wo hängt denn da bei mir der Knoten?? :? :lol:
 
B

Beni

Gast
Phaxx hat gesagt.:
Hmm... dann hab ich's glaub trotzdem noch nicht ganz verstanden... :roll: :)
Also, das Object lock und die console laufen ja im selben Thread, oder?

Nein (sonst würde das ganze ja nicht funktionieren). Sobald das Frame aufgeht, startet ein neuer Thread, der die Console übernimmt.

Phaxx hat gesagt.:
Und .wait() bezieht sich doch auf den Thread, nicht auf's Object, nicht? Aber dann hätte ja this.wait() und lock.wait()grundsätzlich dieselbe Wirkung, nämlich dass der Thread, welcher diese beide Objects beinhaltet in die Pause geschickt wird...?
Es bezieht sich auf den Thread (den es anhaltet) und auf das Object (welches als einziges Object den Thread weiterlaufen lassen kann (abgesehen von Thread#interrupt...)).
Die Wirkung wäre schon dieselbe, aber jeder könnte das weitere Verhalten beeinflussen. Denn mit dem "lock" kannst nur Du das "wait" beenden, mit dem "this" kann jeder das "wait" beenden.

mfg Beni
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3
E KeyListener AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben