大家好:
我现在在用VisualAge for Java开发一个GUI,由于某些原因,必须混用awt和swing控件,可是这样引起了一个非常伤脑筋的问题,Focus的传递顺序出现混乱!
比如在一个TextField1后面加入两个JTextField1,JTextField2,再加上一个TextField2,在使用Tab时Focus会从TextField1直接跳到TextField2,就算我在TextField1的Focus_Lost函数中最后写上JtextField1.requestFocus()也没有用
我在CSDN上搜索了相关的文章,也尝试了一些方法如使用SwingUtilities.InvokeLater()等,但都没有什么作用
希望知道解决方法的大侠指点,谢谢!
我现在在用VisualAge for Java开发一个GUI,由于某些原因,必须混用awt和swing控件,可是这样引起了一个非常伤脑筋的问题,Focus的传递顺序出现混乱!
比如在一个TextField1后面加入两个JTextField1,JTextField2,再加上一个TextField2,在使用Tab时Focus会从TextField1直接跳到TextField2,就算我在TextField1的Focus_Lost函数中最后写上JtextField1.requestFocus()也没有用
我在CSDN上搜索了相关的文章,也尝试了一些方法如使用SwingUtilities.InvokeLater()等,但都没有什么作用
希望知道解决方法的大侠指点,谢谢!
解决方案 »
- 大家帮我看看!为什么Image.getWidth(this)为什么要this?
- 动态显示JFRAME中ContentPane中的内容--后续问题
- java gui的为什么不用SWT,而要用swing
- socet短信发送与线程设计的问题
- 关于JDK的问题,帮忙看一下,多谢啦。
- 类中属性和方法的默认访问控制是public吗?
- System对象的方法资料在那里能找到?API文档里没有.
- 谁有ApacheModuleJServ.dll这个文件发到我的邮箱啊
- 调用ejb的错误,请帮忙看看,帮我顶顶也给分,谢谢
- for(byte b : devices[i].mac_address)的一般写法
- setFileFilter 的问题?--求救呀~~~~
- 在线求助 JTable分页打印的例子,来者有分!
不过我是用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);
}
});
}
}
而且,由于一开始使用的都是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,不知道有什么方法吗?
谢谢!
难题阿,想想先
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);
}
} }
}