TAB-Funktion in Fenster ändern - genauer: STRG+TAB

  • Themenstarter Themenstarter Reeny
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

Reeny

Gast
Hallo ihr guten Helferleins,

während ich hier programmiere, hab ich ein großes fettes Fragezeichen über meinem Kopf, welches mit der Zeit immer größer wird :bahnhof: Die Lösung ist bestimmt eigentlich ganz simple ...

Mein Startpunkt: Ausgehend von einem ganz anderen größeren Problem bin ich bis auf dieses Codestück (s.u.) runtergekommen, um das "Spiel" mit dem Fokus zu verstehn und zu testen. Es ist ein Fenster mit nutzlosen Buttons und Textfelder, welches auf Tastenkombinationen reagieren soll. Die dabei erkannten Tasten werden ausgegeben.

Mein Ziel: manche Elemente sollen auf die Kombination STRG-TAB unterschiedlich reagieren. Aber ich komm nicht mal soweit, dass diese Tasten-Kombination abgefangen wird ... :cry:

Mein Lösungsansatz: Das liegt, denke ich, daran, dass die Taste TAB nicht erkannt wird und deshalb nie in die richtige if-Bedingung gesprungen werden kann. Es wird nur das STRG bemerkt (sichtbar bei der StandardAusgabe ...).
Deswegen hab ich mit der InputMap und ActionMap gearbeitet, aber keine Reaktion!!! :x Ich will eigentlich auch nicht die TAB-Taste aus der Input-Map nehmen, was aber sowieso nicht geht, weil unter den erkannten KeyStrokes von 'text1' leider kein TAB dabei ist ... :autsch:

Das Ergebnis: Ich habe einen Knoten im Kopf! 🙂 Kann mit da jmd vielleicht einen hilfreichen Tip geben, wie ich das Programm dazu bringe, auf STRG+TAB zu reagieren?

Der Code:
Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;


public class FocusTestFrame extends JFrame implements KeyListener{
	JPanel north = new JPanel(new BorderLayout());
	JTextField text1 = new JTextField("text1"); 
	JTextField text2 = new JTextField("text2"); 
	
	JPanel center = new JPanel(new BorderLayout()); 
	JLabel labelCenter = new JLabel("Label im Center"); 
	JButton buttonCenter = new JButton("Button im Center"); 
	
	JPanel west = new JPanel(new BorderLayout()); 
	JButton westLinks = new JButton("west - links"); 
	JButton westRechts = new JButton("west - rechts");
	JButton westUnten = new JButton("west - unten"); 
	
	JPanel south = new JPanel(new BorderLayout()); 
	JPanel southEast = new JPanel(new BorderLayout()); 
	JPanel southWest = new JPanel(new BorderLayout()); 
	JButton bla = new JButton("bla"); 
	JButton bli = new JButton("bli"); 
	JButton blubb = new JButton("blubb"); 
	JButton blob = new JButton("blob"); 
	
	
	Action machWas = new AbstractAction() {
	    public void actionPerformed(ActionEvent e) {
	        System.out.println(" JIPPIE: TASTENKOMBI ANGEKOMMEN!!!");
	    }
	};
	
	
	/**
	 * Konstruktor
	 */
	public FocusTestFrame(){
		// Das Test-Fenster selber
		super("FokusTest");
		setName("JFrame");
		addKeyListener(this);
		Container cp = getContentPane();

		// Der NordPanel
		north.setName("NordPanel");
		text1.setName("text1");
		text2.setName("text2");
		text1.addKeyListener(this);
		text2.addKeyListener(this);
		// text1 soll auf 'Strg+TAB' reagieren
		text1.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,InputEvent.CTRL_DOWN_MASK),"machWas");
		text1.getActionMap().put("doNothing",machWas);
		/*KeyStroke[] liste = text2.getInputMap().allKeys();
		 for (int i=0;i<liste.length; i++)
			System.out.println((i+1)+". "+liste[i].toString());*/
		
		// Der Center-Panel
		center.setName("centerPanel");
		labelCenter.setName("Label im Center");
		buttonCenter.setName("button im Center");
		buttonCenter.addKeyListener(this);
		
		// Der WestPanel
		west.setName("westPanel");
		westLinks.setName("Button west-links");
		westRechts.setName("Button west - rechts");
		westUnten.setName("Button west - unten");
		westLinks.addKeyListener(this);
		westRechts.addKeyListener(this);
		westUnten.addKeyListener(this);
		
		// Der SüdPanel
		south.setName("southPanel");
		southEast.setName("southEastPanel");
		southWest.setName("southWestPanel");
		bla.setName("bla");
		bli.setName("bli");
		blubb.setName("blubb");
		blob.setName("blob");
		bla.addKeyListener(this);
		bli.addKeyListener(this);
		blubb.addKeyListener(this);
		blob.addKeyListener(this);
		
		
		// Die Zusammensetzung
		cp.setLayout(new BorderLayout());
		
		north.add(text1,BorderLayout.NORTH);
		north.add(text2, BorderLayout.SOUTH);
		cp.add(north, BorderLayout.NORTH);
		
		center.add(labelCenter, BorderLayout.NORTH);
		center.add(buttonCenter, BorderLayout.SOUTH);
		cp.add(center, BorderLayout.CENTER);
		
		west.add(westLinks, BorderLayout.WEST);
		west.add(westRechts, BorderLayout.EAST);
		west.add(westUnten, BorderLayout.SOUTH);
		cp.add(west, BorderLayout.WEST);

		southEast.add(bla, BorderLayout.NORTH);
		southEast.add(bli, BorderLayout.SOUTH);
		southWest.add(blubb, BorderLayout.NORTH);
		southWest.add(blob, BorderLayout.SOUTH);
		south.add(southWest, BorderLayout.WEST);
		south.add(southEast, BorderLayout.EAST);
		cp.add(south, BorderLayout.SOUTH);
		
		// Allgemeines
		setSize(400,400);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		pack();
		show();
		
		try{
			OCRFocusTraversalPolicy policy = new OCRFocusTraversalPolicy(cp);
			/*cp.setFocusTraversalPolicy(policy);

			policy.getCycle().clear();
			policy.getCycle().addComponent(text1);
			policy.getCycle().addComponent(text2);
			policy.getCycle().addComponent(buttonCenter);
			policy.getCycle().addComponent(westUnten);
			policy.getCycle().addComponent(westLinks);
			policy.getCycle().addComponent(blubb);
			policy.getCycle().addComponent(bli);*/
		}catch(IllegalArgumentException iae){
			System.out.println(iae.getMessage());
			iae.printStackTrace();
		}catch(IllegalAccessException iacce){
			System.out.println(iacce.getMessage());
			iacce.printStackTrace();
		}catch(Exception e){
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		

		//printList(((OCRFocusTraversalPolicy)cp.getFocusTraversalPolicy()).getCycle());
		
	}
	
	// ####################### Die KeyListener-Funktionen #################################
	public void keyPressed(KeyEvent e){
		System.out.println("(pressed) "+e.getKeyChar() + " : " + e.getKeyCode());
		if (e.getKeyCode() == KeyEvent.VK_ENTER) 
			System.out.println("-> Enter\t\t(pressed)");
		if (e.getKeyCode() == KeyEvent.VK_I) 
			System.out.println("-> 'I'\t\t(pressed)");
		// --> STRG-Taste
		if(e.getKeyCode() == KeyEvent.VK_CONTROL){
			System.out.println("STRG gedrückt ...");
		}
		if(e.getKeyCode()== KeyEvent.VK_TAB)
			System.out.println("TAB-gedrückt ... ");
	}

	/**
	 */	
	public void keyReleased(KeyEvent e){
		System.out.println("(released) "+e.getKeyChar()+" : "+e.getKeyCode());
		// -------------- ALT - Tasten -----------------------------------------
		if (e.isAltDown()) {
			if (e.getKeyCode() == KeyEvent.VK_LEFT) 
				System.out.println("-> Alt + Links\t(released)");
			 else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
				System.out.println("-> Alt + Rechts\t(released)");
			 else if (e.getKeyCode() == KeyEvent.VK_UP) 
				System.out.println("-> Alt + Hoch\t(released)");
			 else if (e.getKeyCode() == KeyEvent.VK_DOWN) 
				System.out.println("-> Alt + Runter\t(released)");
			 else if (e.getKeyCode() == KeyEvent.VK_EQUALS || e.getKeyCode() == KeyEvent.VK_ADD)
				System.out.println("-> Alt + '+'\t(released)");
			 else if (e.getKeyCode() == KeyEvent.VK_MINUS || e.getKeyCode() == KeyEvent.VK_SUBTRACT)
				System.out.println("-> Alt + '-'\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_DELETE)
				System.out.println("-> Alt + ENTF\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_COMMA) 
				System.out.println("-> Alt + ','\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_PERIOD) 
				System.out.println("-> Alt + '.'\t(released)");
			/*-------------------Ende ALT-Einstellungen--------------------------*/


			if (e.getKeyCode() == KeyEvent.VK_F2)
				System.out.println("-> F2\t\t\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_F4)
				System.out.println("-> F4\t\t\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_F9) 
				System.out.println("-> F9\t\t\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_F12)
				System.out.println("-> F12\t\t\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
				System.out.println("-> ESC\t\t\t(released)");
		}
		
		// --> TAB-Taste
		if(e.getKeyCode()==KeyEvent.VK_TAB){
			if (e.isControlDown()) {
				if(e.getComponent().getName().equals("text1")){
					text2.requestFocus();
					System.out.println("Endlich!!! TAB(released) mit STRG");
				}
				else if (e.getComponent().getName().equals("Button west - unten")){
					text2.requestFocus();
					System.out.println("Endlich!!! TAB(released) mit STRG");
				}
			}
			else{
				System.out.println("-> Tab(released) ohne STRG");
			}
		}			
	}
	
	/**
	 */
	public void keyTyped(KeyEvent e){
		System.out.println("(typed) "+e.getKeyChar()+" : "+e.getKeyCode());
	}

// ############################ MAIN #######################################

	public static void main(String[] args){
		FocusTestFrame theFrame=new FocusTestFrame();
	}
	
	
}

Danke, und viel Spaß beim Knobeln *g*.

Reeny
 
das liegt daran das der Tab ein standardfocus key ist, wegbekommen kannst du ihn hiermit

Code:
import java.util.HashSet;
import javax.swing.KeyStroke;
import javax.swing.FocusManager;


    FocusManager fm = FocusManager.getCurrentManager();
    Set newKeys = new HashSet(fm.getDefaultFocusTraversalKeys(FocusManager.
        FORWARD_TRAVERSAL_KEYS));
    newKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,0));
    fm.setDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS,
                                newKeys);
 
Danke dafür. 😀
Ist jetzt mit eingebaut, aber hast du das auch mal selbst probiert? Auf TAB alleine wird jetzt ordnungsgemäß mit einer Textausgabe reagiert, ohne zwischen den Komponenten zu switchen :applaus: . Aber jetzt geht er plötzlich nicht mehr in
Code:
if(e.isControlDown()){...}
rein. Wenn ich den Debugger starte, sehe ich folgende Schritte, die bei Drücken von STRG+TAB gemacht werden.
1. STRG pressed -> nix tun
2. STRG typed -> nix tun
3. STRG released -> nix tun

Aber was ist mit TAB? Es werden jetzt plötzlich nur noch einzelne Zeichen akzeptiert. Außerdem wechselt das Programm nach dieser Tastenkombination doch zur nächsten Komponente (aber das wird schon richtig sein ...).

Ich hab das Programm ein wenig angepasst. Vielleicht liegt es daran?

Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashSet;
import java.util.Set;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.FocusManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;


public class FocusTestFrame extends JFrame implements KeyListener{
	JPanel north = new JPanel(new BorderLayout());
	JTextField text1 = new JTextField("text1"); 
	JTextField text2 = new JTextField("text2"); 
	
	JPanel center = new JPanel(new BorderLayout()); 
	JLabel labelCenter = new JLabel("Label im Center"); 
	JButton buttonCenter = new JButton("Button im Center"); 
	
	JPanel west = new JPanel(new BorderLayout()); 
	JButton westLinks = new JButton("west - links"); 
	JButton westRechts = new JButton("west - rechts");
	JButton westUnten = new JButton("west - unten"); 
	
	JPanel south = new JPanel(new BorderLayout()); 
	JPanel southEast = new JPanel(new BorderLayout()); 
	JPanel southWest = new JPanel(new BorderLayout()); 
	JButton bla = new JButton("bla"); 
	JButton bli = new JButton("bli"); 
	JButton blubb = new JButton("blubb"); 
	JButton blob = new JButton("blob"); 
	
	
	Action machWas = new AbstractAction() {
	    public void actionPerformed(ActionEvent e) {
	        System.out.println(" JIPPIE: TASTENKOMBI ANGEKOMMEN!!!");
	    }
	};
	
	
	/**
	 * Konstruktor
	 */
	public FocusTestFrame(){
		// Einstellungen zum Test-Fenster selber
		super("FokusTest");
		setName("JFrame");
		addKeyListener(this);
		Container cp = getContentPane();
		
		FocusManager fm = FocusManager.getCurrentManager(); 
	    Set newKeys = new HashSet(fm.getDefaultFocusTraversalKeys(FocusManager. 
	        FORWARD_TRAVERSAL_KEYS)); 
	    newKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,0)); 
	    fm.setDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS, 
	                                newKeys);

		// Einstellungen zum NordPanel
		north.setName("NordPanel");
		text1.setName("text1");
		text2.setName("text2");
		text1.addKeyListener(this);
		text2.addKeyListener(this);
		// text1 soll auf 'Strg+TAB' reagieren
		text1.getInputMap().put(KeyStroke.getKeyStroke("control pressed TAB"),"machWas");
		text1.getActionMap().put("machWas",machWas);

		// Einstellungen zum Center-Panel
		center.setName("centerPanel");
		labelCenter.setName("Label im Center");
		buttonCenter.setName("button im Center");
		buttonCenter.addKeyListener(this);
		
		// Einstellungen zum WestPanel
		west.setName("westPanel");
		westLinks.setName("Button west-links");
		westRechts.setName("Button west - rechts");
		westUnten.setName("Button west - unten");
		westLinks.addKeyListener(this);
		westRechts.addKeyListener(this);
		westUnten.addKeyListener(this);
		
		// Einstellungen zum SüdPanel
		south.setName("southPanel");
		southEast.setName("southEastPanel");
		southWest.setName("southWestPanel");
		bla.setName("bla");
		bli.setName("bli");
		blubb.setName("blubb");
		blob.setName("blob");
		bla.addKeyListener(this);
		bli.addKeyListener(this);
		blubb.addKeyListener(this);
		blob.addKeyListener(this);
		
		
		// Die Zusammensetzung
		cp.setLayout(new BorderLayout());
		
		north.add(text1,BorderLayout.NORTH);
		north.add(text2, BorderLayout.SOUTH);
		cp.add(north, BorderLayout.NORTH);
		
		center.add(labelCenter, BorderLayout.NORTH);
		center.add(buttonCenter, BorderLayout.SOUTH);
		cp.add(center, BorderLayout.CENTER);
		
		west.add(westLinks, BorderLayout.WEST);
		west.add(westRechts, BorderLayout.EAST);
		west.add(westUnten, BorderLayout.SOUTH);
		cp.add(west, BorderLayout.WEST);

		southEast.add(bla, BorderLayout.NORTH);
		southEast.add(bli, BorderLayout.SOUTH);
		southWest.add(blubb, BorderLayout.NORTH);
		southWest.add(blob, BorderLayout.SOUTH);
		south.add(southWest, BorderLayout.WEST);
		south.add(southEast, BorderLayout.EAST);
		cp.add(south, BorderLayout.SOUTH);
		
		// Allgemeines
		setSize(400,400);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		pack();
		show();
		
		try{
			OCRFocusTraversalPolicy policy = new OCRFocusTraversalPolicy(cp);
		}catch(IllegalArgumentException iae){
			System.out.println(iae.getMessage());
			iae.printStackTrace();
		}catch(IllegalAccessException iacce){
			System.out.println(iacce.getMessage());
			iacce.printStackTrace();
		}catch(Exception e){
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		

		//printList(((OCRFocusTraversalPolicy)cp.getFocusTraversalPolicy()).getCycle());
		
	}
	
	// ####################### Die KeyListener-Funktionen #################################
	public void keyPressed(KeyEvent e){
		
	}

	/**
	 */	
	public void keyReleased(KeyEvent e){
		// -------------- ALT - Tasten -----------------------------------------
		if (e.isAltDown()) {
			if (e.getKeyCode() == KeyEvent.VK_LEFT) 
				System.out.println("-> Alt + Links\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
				System.out.println("-> Alt + Rechts\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_UP) 
				System.out.println("-> Alt + Hoch\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_DELETE)
				System.out.println("-> Alt + ENTF\t(released)");
			else if (e.getKeyCode() == KeyEvent.VK_PERIOD) 
				System.out.println("-> Alt + '.'\t(released)");
			/*-------------------Ende ALT-Einstellungen--------------------------*/

		}

		// --> CTRL-Taste mit gedrückt
		else if(e.isControlDown()){
			if(e.getKeyCode()==KeyEvent.VK_TAB)
				System.out.println("Endlich!!! TAB(released) mit STRG");
		}
		
		// --> TAB-Taste
		else if(e.getKeyCode()==KeyEvent.VK_TAB){
			if (e.isControlDown()) {
				if(e.getComponent().getName().equals("text1")){
					text2.requestFocus();
					System.out.println("Endlich!!! TAB(released) mit STRG");
				}
				else if (e.getComponent().getName().equals("Button west - unten")){
					text2.requestFocus();
					System.out.println("Endlich!!! TAB(released) mit STRG");
				}else
					System.out.println("zwar STRG+TAB, aber falsches Feld");
			}
			else
				System.out.println("-> Tab(released) ohne STRG");
			
		}	
		
		// paar F-Tasten und ESC
		else if (e.getKeyCode() == KeyEvent.VK_F2)
			System.out.println("-> F2\t\t\t(released)");
		else if (e.getKeyCode() == KeyEvent.VK_F4)
			System.out.println("-> F4\t\t\t(released)");
		else if (e.getKeyCode() == KeyEvent.VK_F9) 
			System.out.println("-> F9\t\t\t(released)");
		else if (e.getKeyCode() == KeyEvent.VK_F12)
			System.out.println("-> F12\t\t\t(released)");
		else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
			System.out.println("-> ESC\t\t\t(released)");
		}
	
	/**
	 */
	public void keyTyped(KeyEvent e){
		System.out.println("(typed) "+e.getKeyChar()+" : "+e.getKeyCode());
	}

// ############################ MAIN #######################################

	public static void main(String[] args){
		FocusTestFrame theFrame=new FocusTestFrame();
	}
	
	
}
 
Hah! Geknackt!!!

Ich liebe Java :toll:
Mann, hat das gedauert! Also, dass mit den FocusManager und den DefaultFocusTraversalKeys war schon gut, aber statt TAB musste ich "ctrl TAB" rausnehmen! Ich wußte gar nicht, dass es so eine Kombination auch dort gibt ... :?

Also nochmal danke für die Tipps ... Leider habe ich jetzt gemerkt, dass hier im Forum schnell geholfen wird, was bedeutet, dass ich ab jetzt mehr Fragen posten werde ... :wink:

Reeny
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben