Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨多个JPanel的摇摆焦点策略_Java_Swing_Focus - Fatal编程技术网

Java 跨多个JPanel的摇摆焦点策略

Java 跨多个JPanel的摇摆焦点策略,java,swing,focus,Java,Swing,Focus,我有两个JPanel对象,它们包含多个组件。 每个面板都有自己的焦点策略 我想从第一个面板的第一个组件开始聚焦循环。 当焦点到达第一个面板的最后一个组件时,当我按Tab键时,焦点应跳到第二个面板的第一个组件 在两个面板上,都启用了FocusTraversalPolicyProvider 这是怎么回事 public class Panel1 extends JPanel{ private JTextField text1; private JTextField text2;

我有两个
JPanel
对象,它们包含多个组件。 每个面板都有自己的
焦点策略

我想从第一个面板的第一个组件开始聚焦循环。 当焦点到达第一个面板的最后一个组件时,当我按Tab键时,焦点应跳到第二个面板的第一个组件

在两个面板上,都启用了
FocusTraversalPolicyProvider

这是怎么回事

public class Panel1 extends JPanel{

    private JTextField text1;
    private JTextField text2;

    public JPanel1(){
        init();
    }

    private void init(){
        text1 = new JTextField();
        text2 = new JTextField();

        this.setLayout(new FlowLayout());
        this.add(text1);
        this.add(text2);

        this.setFocusTraversalPolicyProvider(true);
        this.setFocusTraversalPolicy(new SimpleFocusTraversalPolicy(
            text1,
            text2
        ));
    }
}

public class Panel2 extends JPanel{

    private JTextField text1;
    private JTextField text2;

    public JPanel2(){
        init();
    }

    private void init(){
        text1 = new JTextField();
        text2 = new JTextField();

        this.setLayout(new FlowLayout());
        this.add(text1);
        this.add(text2);

        this.setFocusTraversalPolicyProvider(true);
        this.setFocusTraversalPolicy(new SimpleFocusTraversalPolicy(
            text1,
            text2
        ));
    }
}

public class ContainerPanel extends JPanel{

    private JPanel panel1, panel2;

    public ContainerPanel(){
        init();
    }

    private void init(){
        panel1 = new Panel1();
        panel2 = new Panel2();

        this.setLayout(new FlowLayout());
        this.add(panel1);
        this.add(panel2);

        /*
            what should I do here to jump from panel1 to panel2 after the last component of panel1?
        */
    }
}

您可能可以重写
FocusTraversalPolicy#getComponentAfter(…)
方法:

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

public class SimpleFocusTraversalPolicyTest {
  private JComponent makeUI() {
    JTextField t1 = new JTextField("3", 12);
    JTextField t2 = new JTextField("1", 12);
    JTextField t3 = new JTextField("4", 12);
    JTextField t4 = new JTextField("2", 12);
    JPanel p1 = new JPanel();
    p1.setBorder(BorderFactory.createTitledBorder("left"));
    p1.setFocusTraversalPolicy(new SimpleFocusTraversalPolicy(t2, t4, t1, t3));
    p1.add(t1); p1.add(t2); p1.add(t3); p1.add(t4);
    p1.setFocusTraversalPolicyProvider(true);
    p1.setFocusCycleRoot(false);

    JTextField t5 = new JTextField("4", 12);
    JTextField t6 = new JTextField("3", 12);
    JTextField t7 = new JTextField("2", 12);
    JTextField t8 = new JTextField("1", 12);
    JPanel p2 = new JPanel();
    p2.setBorder(BorderFactory.createTitledBorder("right"));
    p2.setFocusTraversalPolicy(new SimpleFocusTraversalPolicy(t8, t7, t6, t5));
    p2.add(t5); p2.add(t6); p2.add(t7); p2.add(t8);
    p2.setFocusTraversalPolicyProvider(true);
    p2.setFocusCycleRoot(false);

    JPanel p = new JPanel(new GridLayout(1, 2));
    p.add(p1);
    p.add(p2);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new SimpleFocusTraversalPolicyTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

//There is no SimpleFocusTraversalPolicy in your code, so this is just an example:
class SimpleFocusTraversalPolicy extends FocusTraversalPolicy {
  private final List<? extends Component> order;
  public SimpleFocusTraversalPolicy(Component... arrays) {
    super();
    this.order = Arrays.asList(arrays);
  }
  @Override public Component getFirstComponent(Container focusCycleRoot) {
    return order.get(0);
  }
  @Override public Component getLastComponent(Container focusCycleRoot) {
    return order.get(order.size() - 1);
  }
  @Override public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
    int idx = order.indexOf(aComponent) + 1;
    if (idx >= order.size() && !focusCycleRoot.isFocusCycleRoot()) {
      return null;
    } else {
      return order.get(idx % order.size());
    }
  }
  @Override public Component getComponentBefore(Container focusCycleRoot, Component aComponent) {
    int idx = order.indexOf(aComponent) - 1;
    if (idx < 0 && !focusCycleRoot.isFocusCycleRoot()) {
      return null;
    } else {
      return order.get((idx + order.size()) % order.size());
    }
  }
  @Override public Component getDefaultComponent(Container focusCycleRoot) {
    return order.get(0);
  }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入java.util.List;
导入javax.swing.*;
公共类SimpleFocusTraversalPolicyTest{
私有JComponent makeUI(){
JTextField t1=新的JTextField(“3”,12);
JTextField t2=新的JTextField(“1”,12);
JTextField t3=新的JTextField(“4”,12);
JTextField t4=新的JTextField(“2”,12);
JPanel p1=新的JPanel();
p1.设置顺序(BorderFactory.createTitledBorder(“左”);
p1.setFocusTraversalPolicy(新的简单客户旅行策略(t2、t4、t1、t3));
p1.添加(t1);p1.添加(t2);p1.添加(t3);p1.添加(t4);
p1.setFocusTraversalPolicyProvider(真);
p1.setFocusCycleRoot(假);
JTextField t5=新的JTextField(“4”,12);
JTextField t6=新的JTextField(“3”,12);
JTextField t7=新的JTextField(“2”,12);
JTextField t8=新的JTextField(“1”,12);
JPanel p2=新的JPanel();
p2.设置顺序(BorderFactory.createTitledBorder(“右”);
p2.setFocusTraversalPolicy(新的SimpleFocusTraversalPolicy(t8、t7、t6、t5));
p2.添加(t5);p2.添加(t6);p2.添加(t7);p2.添加(t8);
p2.setFocusTraversalPolicyProvider(真);
p2.setFocusCycleRoot(假);
JPanel p=新的JPanel(新的网格布局(1,2));
p、 添加(p1);
p、 添加(p2);
返回p;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的SimpleFocusTraversalPolicyTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
//您的代码中没有SimpleFocusTraversalPolicy,因此这只是一个示例:
类SimpleFocusTraversalPolicy扩展了FocusTraversalPolicy{

私人最终列表考虑提供一个演示您的问题的列表。这将减少混乱和更好的响应。您能描述一下现在发生了什么以及您希望发生什么吗?现在您可以看到上面的一个小示例。哦,很抱歉,我忘了添加SimpleFocusTraversalPolicy。我像您一样编写了getComponentAfter方法。但是当我启动应用程序时,在第一个面板的第一个组件上没有焦点。