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
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.