大家好:
    我现在在用VisualAge for Java开发一个GUI,由于某些原因,必须混用awt和swing控件,可是这样引起了一个非常伤脑筋的问题,Focus的传递顺序出现混乱!
比如在一个TextField1后面加入两个JTextField1,JTextField2,再加上一个TextField2,在使用Tab时Focus会从TextField1直接跳到TextField2,就算我在TextField1的Focus_Lost函数中最后写上JtextField1.requestFocus()也没有用
我在CSDN上搜索了相关的文章,也尝试了一些方法如使用SwingUtilities.InvokeLater()等,但都没有什么作用
希望知道解决方法的大侠指点,谢谢!

解决方案 »

  1.   

    你是不是先放两个TextField然后放两个JTextField,按focuse要求的顺序放的话也不行的么?JTextField好像有方法可以设定nextfocuse的。textfield就不太清楚了方便的话能不能告诉一下为什么混着用呢?
      

  2.   

    版主说的问题我试了一下,焦点传递没有问题阿,一下是源码:
    不过我是用jcreator写的,import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;public class Jdemo extends JApplet
    {
    private JTextField jb1=new JTextField("jb1");
    private JTextField jb2=new JTextField("jb2");
    private TextField  b1=new TextField("awtb1");
    private TextField  b2=new TextField("awtb2");

    public Jdemo()
    {
    init();

    }

    public void init()
    {
    Container con=this.getContentPane();
    con.setLayout(new FlowLayout());
    con.add(b1);
    con.add(jb1);
    con.add(jb2);
    con.add(b2);

    }
    public static void main(String args[])
    {
    JFrame jf=new JFrame();
    Jdemo jdemo=new Jdemo();


    jf.setContentPane(jdemo.getContentPane());

    jf.setSize(400,400);
    jf.setVisible(true);

    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jf.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) 
    {
    System.exit(0);
    }
    });
    }
    }
      

  3.   

    感谢大家对我问题的回复,我混用这两种组件的原因是swing组件似乎不支持一些罕见的中文,而awt组件支持,因此为了使GUI能够接受所有的中文,我不得不在一些需要输入姓名和地址等信息的地方使用awt
    而且,由于一开始使用的都是swing,直到最后才把某些组件换成了awt,导致awt组件是连续加入的,但是它们的位置或者说是Focus的顺序并非连续,系统在Focus传递时会按照awt之间的顺序而忽视在两个awt组件之间可能还有swing组件的情况,从而产生了上面的问题
    不知道我这样说大家是不是清楚一些情况了
    谢谢!我看了ralihm(raly)的代码,真谢谢你还为这个问题写了demo程序
    不过我发现在init()中组件加入的顺序是b1,jb1,jb2,b2,因此系统会按照加入顺序正确地传递Focus,但是我的问题是组件加入的顺序是jb1,jb2,b1,b2,但我希望得到的Focus顺序是b1,jb1,jb2,b2,不知道有什么方法吗?
    谢谢!
      

  4.   

    sunyax(太古阳光):难怪会出现这样的这样的问题
    难题阿,想想先
      

  5.   

    自定义FocusTraversalPolicy可以任意设定focus顺序。我编了一个小程序演示。程序中有三个JTextField,两个TextField。Name属性标示focus顺序。运行后使用Tab or Shift+Tab可按自定义顺序改变focus。
      

  6.   

    程序如下:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;/**
     * The use of FocusTraversalPolicy.
     * @author Simon
     */public class F extends Frame{
       DefaultKeyboardFocusManager kfm;   TextField tf1;
       TextField tf2;   JTextField jtf1;
       JTextField jtf2;
       JTextField jtf3;   F() {      setFocusTraversalPolicy(
                   new MyFocusTraversalPolicy());
             
          jtf1 = new JTextField("jtf1.focus5");
          jtf1.setName("5");      jtf2 = new JTextField("jtf2.focus2");
          jtf2.setName("2");      jtf3 = new JTextField("jtf3.focus3");
          jtf3.setName("3");      tf1 = new TextField("tf1.focus4");
          tf1.setName("4");      tf2 = new TextField("tf2.focus1");
          tf2.setName("1");      setLayout(new GridLayout());      add(jtf1);
          add(jtf2);
          add(jtf3);      add(tf1);
          add(tf2);
       }
       public static void main(String args[]) {
          F f = new F();
          f.setTitle("Merlin Focus");
          f.pack();      f.setVisible(true);
       }
    class MyFocusTraversalPolicy 
    extends DefaultFocusTraversalPolicy{ public Component getFirstComponent(Container focusCycleRoot){
    return(tf2);
    }
    public Component getLastComponent(Container focusCycleRoot){
    return(jtf1);
    }
      
    public Component getComponentAfter(Container focusCycleRoot,
                                                Component aComponent){ if(aComponent.getName().equals("1")){
    return(jtf2);
    }
    else if(aComponent.getName().equals("2")){
    return(jtf3);
    }
    else if(aComponent.getName().equals("3")){
    return(tf1);
    }
    else if(aComponent.getName().equals("4")){
    return(jtf1);
    }
    else{
    return(tf2);
    }
    } public Component getComponentBefore(Container focusCycleRoot,
                                                Component aComponent){ if(aComponent.getName().equals("1")){
    return(jtf1);
    }
    else if(aComponent.getName().equals("2")){
    return(tf2);
    }
    else if(aComponent.getName().equals("3")){
    return(jtf2);
    }
    else if(aComponent.getName().equals("4")){
    return(jtf3);
    }
    else{
    return(tf1);
    }
    } }
    }