Key Listener macht nicht das was er soll

Status
Nicht offen für weitere Antworten.

hawkeye78

Bekanntes Mitglied
Hallo,

ich versuche mich gerade daran eine Eingabemaske zu erstellen in der ich später eine Mac-Addresse von einer Netzwerkkarte eingeben kann. Ich hatte mich dabei bis jetzt versucht nach dieser Seite zu richten und habe bis jetzt folgenden Quellcode verbrochen:

Code:
	public class Oberflaeche
	extends JFrame
	implements KeyListener
	{
		// Definition der Textfelder
		private JTextField tfMac=new JTextField(17);
		
		// Definition der Labels
		private JLabel lMac=new JLabel("MAC-Adresse");
		
		// Definition des Buttons
		private JButton send=new JButton("senden");
				
		public Oberflaeche()
		{
			super("Test");
	
			JPanel panel = new JPanel();	
			panel.setLayout(new GridLayout(6, 1));
			
			tfMac.addKeyListener(this);		
			
			panel.add(lMac);
			panel.add(tfMac);
			panel.add(lIP);

			panel.add(send);
			
			getContentPane().add(panel,"Center");
		}
		
	    public void keyPressed(KeyEvent e)
	    {
	        Object o = e.getSource();
	
	        if(o instanceof TextField)
	        {
	            JTextField tf = (JTextField)o;
	
	            if(tf == tfMac)
	            {
	                int keycode = e.getKeyCode();
	            
	                if(tf.getText().length() >= 3)
	                {
	                    switch (keycode)
	                    {
	                        case KeyEvent.VK_ENTER:
	                        case KeyEvent.VK_BACK_SPACE:
	                        case KeyEvent.VK_DELETE:
	                        case KeyEvent.VK_LEFT:
	                        case KeyEvent.VK_RIGHT:
	                            return;
	                        default:
	                            break;
	                    }
	
	                    e.consume();
	                }
	                else
	                {
	                    switch (keycode)
	                    {
	                        case KeyEvent.VK_ENTER:
	                        case KeyEvent.VK_BACK_SPACE:
	                        case KeyEvent.VK_DELETE:
	                        case KeyEvent.VK_LEFT:
	                        case KeyEvent.VK_RIGHT:
	                        case KeyEvent.VK_0:
	                        case KeyEvent.VK_1:
	                        case KeyEvent.VK_2:
	                        case KeyEvent.VK_3:
	                        case KeyEvent.VK_4:
	                        case KeyEvent.VK_5:
	                        case KeyEvent.VK_6:
	                        case KeyEvent.VK_7:
	                        case KeyEvent.VK_8:
	                        case KeyEvent.VK_9:
	                            return;
	                        default:
	                            break;
	                    }
	
	                    e.consume();
	                }
	            }
	        }
	    }
	
	    public void keyReleased(KeyEvent e)
	    {}    
	public void keyTyped(KeyEvent e) {}

Allerdings weigert sich das Programm bis jetzt die entsprechende Eingabe länge zu begrenzen bzw. einige Zeichen von der Eingabe auszuschließen. Da ich im moment leider ziemlich ratlos bin woran es noch liegen könnte wäre ich über einen entsprechenden Hinweis auf jeden Fall sehr dankbar.
Viele Grüsse
Dan
 
Ich würde das über ein eigenes Document regeln, indem du dort die insertString-methode überschreibst. Benutz mal die Suche, dazu gibt es schon einige Beiträge.
 
Hallo foobar,

ich dachte schon eigentlich daran das so zu lösen wie es da jetzt steht 🙂 (und ja ich weiß ich kann recht sturr sein), aber dafür habe ich nun auch schon mal heraus gefunden woran es liegt die Methode "consume()" scheint nur in der Kombination mit AWT-Elementen zu funktionieren, da ich aber versuche Swing zu verwenden kommt er offenbar damit nicht klar.
Allerdings ist nun noch die Frage wie ich dieses Problem löse
Viele Grüsse
Dan
 
AFAIK bekommt das JTextField den KeyEvent zuerst, also ist es nutzlos das Event zu konsumieren.
Du könntest im Listener einen neuen Text auf das Textfeld setzen, aber der saubere Weg ist über das Document
 
Hallo Wildcard,

ich habe gerade heraus gefunden das ich offenbar nur den falschen EventListener verwendet habe und darum das "consume()" nicht funktioniert hat, nachdem ich den Quellcode ein bißchen umgestrickt habe schaut das jetzt so aus:
Code:
	import javax.swing.*;
	import java.awt.*;
	import java.awt.event.*;
	
	public class Oberflaeche
	extends JFrame
	{
		// Definition der Textfelder
		private JTextField tfMac=new JTextField(17);
		
		// Definition der Labels
		private JLabel lMac=new JLabel("MAC-Adresse");
		
		// Definition des Buttons
		private JButton send=new JButton("senden");
				
		public Oberflaeche()
		{
			super("Test");
	
			JPanel panel = new JPanel();	
			panel.setLayout(new GridLayout(6, 1));
	        
			
	        addWindowListener(new WindowAdapter()
	        {
	            public void windowClosing(WindowEvent e)
	            {
	            //    quit();
	            }
	        });
			
			panel.add(lMac);
			panel.add(tfMac);
			panel.add(send);
			
			getContentPane().add(panel,"Center");
			
			// Überprüfen auf den Buttons zum Senden
			send.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println(tfMac.getText());
				}
			});
			
			// Keylistener für die korrekte Eingabe
		      tfMac.addKeyListener(new KeyAdapter()
		      {
		          public void keyTyped(KeyEvent e)
		          {
		            //System.out.println("keyevent: "+e.getKeyCode());
		        	  if(tfMac.getText().length()<17)
		        	  {
		        		  switch(e.getKeyChar())
		        		  {
		        		  	case '1':
		        		  	case '2':
		        		  	case '3':
		        		  	case '4':
		        		  	case '5':
		        			case '6':
		        		  	case '7':
		        		  	case '8':
		        		  	case '9':
		        		  	case '0':
		        			case 'A':
		        		  	case 'B':
		        		  	case 'C':
		        		  	case 'D':
		        		  	case 'E':
		        		  	case 'F':
		        			case 'a':
		        		  	case 'b':
		        		  	case 'c':
		        		  	case 'd':
		        		  	case 'e':
		        		  	case 'f':
		        		  	case '-':
		        		  		break;
		        		  	default: e.consume();
		        		  }
		        	  }
		        	  else
		        	  {
		        		  e.consume();
		        	  }
		        	
		          }
		      });

		}
	}

und das funktioniert glücklicherweise 🙂
Noch einmal vielen Dank für die Hilfe
Viele Grüsse
Dan
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben