Pola tekstowe i tabulator

0

Mam dwa pola tekstowe, jedno pod drugim i button na prawo od nich. Jak zmienić kolejność "przeskakiwania" kursora, tak aby z pierwszego pola, przemieścił się od razu do drugiego, z pominięciem aktywowania button'a? Button powinien aktywować się dopiero po naciśnięciu tabulatora w drugim polu tekstowym.

0

Nie potrafię sobie z tym poradzić. Mógłby mi ktoś wyjaśnić na takim prostym przykładzie?

public class Proba_01 extends JFrame implements ActionListener
{ 
	JTextField Pole1, Pole2;
	JTextArea PoleWynikow;
	JButton bZlacz;
	JLabel lPion1, lPion2;	
	String zawartoscPole1, zawartoscPole2;
	    
	public Proba_01()
	{ 
		setSize(800,400);
		setTitle("Proba_01");
		setLayout(null);
			
		Pole1 = new JTextField("");
		Pole1.setBounds(50,50,400,40);
		add(Pole1);
		
		Pole2 = new JTextField("");
		Pole2.setBounds(50,130,400,40);
		add(Pole2);
		
		PoleWynikow = new JTextArea();
		PoleWynikow.setBounds(50,220,800,300);
		add(PoleWynikow);
		
		lPion1 = new JLabel("Pole1");
		lPion1.setBounds(50,10,400,50);
		add(lPion1);
			
		lPion2 = new JLabel("Pole2");
		lPion2.setBounds(50,90,400,50);
		add(lPion2);
							
		bZlacz = new JButton ("ZŁĄCZ");
		bZlacz.setBounds(480,90,100,50);
		add(bZlacz);
		bZlacz.addActionListener(this);
	}
		
	public static void main(String[] args) throws IOException 
	{
		Proba_01 aplikacja = new Proba_01();
		aplikacja.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aplikacja.setExtendedState(JFrame.MAXIMIZED_BOTH);
		aplikacja.setVisible(true);			
	}	
		
	@Override
	public void actionPerformed(ActionEvent e)
	{
		Object z = e.getSource();
		
		zawartoscPole1 = Pole1.getText();
		zawartoscPole2 = Pole2.getText();					
		
		if (z==bZlacz)
		{									
			if (zawartoscPole1.isEmpty() || zawartoscPole2.isEmpty())
			{ 
				PoleWynikow.append("\n Wpisz w pola tekst.");
			}
			
			else if (!zawartoscPole1.isEmpty() && !zawartoscPole2.isEmpty())
			{ 
				PoleWynikow.append("\n " + zawartoscPole1 +" " + zawartoscPole2 + ".");
			}		
        }				
   }
}
0

Znalazłem rozwiązanie tu https://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html
W konstruktorze

...
        bZlacz.addActionListener(this);
        Vector<Component> order = new Vector<Component>(7);
        order.add(Pole1);
        order.add(Pole2);
        order.add(bZlacz);
        FocusTraversalPolicy newPolicy = new MyOwnFocusTraversalPolicy(order);
        setFocusTraversalPolicy(newPolicy);        
    }

Wewnątrz kodu klasy

    public static class MyOwnFocusTraversalPolicy extends FocusTraversalPolicy
    {
        Vector<Component> order;

        public MyOwnFocusTraversalPolicy(Vector<Component> order) {
            this.order = new Vector<Component>(order.size());
            this.order.addAll(order);
        }
        public Component getComponentAfter(Container focusCycleRoot, omponent aComponent)
        {
            int idx = (order.indexOf(aComponent) + 1) % order.size();
            return order.get(idx);
        }

        public Component getComponentBefore(Container focusCycleRoot, Component aComponent)
        {
            int idx = order.indexOf(aComponent) - 1;
            if (idx < 0) {
                idx = order.size() - 1;
            }
            return order.get(idx);
        }

        public Component getDefaultComponent(Container focusCycleRoot) {
            return order.get(0);
        }

        public Component getLastComponent(Container focusCycleRoot) {
            return order.lastElement();
        }

        public Component getFirstComponent(Container focusCycleRoot) {
            return order.get(0);
        }
    }
0

Dzięki bogdans, działa. Myślałem, że jest jakiś prosty sposób, a to jednak wymaga trochę kodu.

0

Skoro wyłączasz menadżera rozkładu

setLayout(null);

i rozmieszczasz komponenty ręcznie, to możesz je dodawać w dowolnej kolejności. Wtedy żaden obiekt typu FocusTraversalPolicy nie będzie potrzebny.

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