将 焦点 交给下一个控件 我在写一些控件,在焦点移动碰到问题:当我按上下键或tab键移动焦点,我怎么才知道下一个应该获得焦点的控件是哪个? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 设置一个临时变量存储当前焦点控件对象让每个控件获得焦点的时候,if 当前临时变量 is not null and 当前临时变量 不得与自己当前临时变量.focus();这个时候就知道下个焦点的控件是谁了,然后当前临时变量设置为null同时下个焦点.focus();大概意思是这样,需要细调下方案2:可以设置每个控件的index吧。你只要在init里面绑定所有的index和控件对象即可推荐方案2 搞那么高深干什么onfocus()事件alert出来元素的name不就行了? 1楼的第二种方案确实有道理,但是index怎么与component绑定?而且像j2se焦点的转移是跟位置有关,最左上角的控件先获得焦点,然后往右跑,再往下跑,并不是添加控件的顺序。我自己的想法是:在每个Container里面有一个控件列表和一个引用focusedComponent指向当前获得焦点的控件,当这个容器获得方向键的事件,则判断focusedComponent是否为null,以及移动的方向,然后改变focusedComponent的值。但问题是,当容器获得方向键的事件,即移动焦点,并且focusedComponent为null时,并不知道焦点从哪个方向来,因为方向键的向上和向下键可以改变焦点移动的方向。 tabindex这个是html的一个属性,可以控制tab键的切换顺序,自己goolge it. 如果你只是想让上下键能改变焦点的话,可以用Component 类的public void setFocusTraversalKeys(int id, Set<? extends AWTKeyStroke> keystrokes) 方法import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.KeyboardFocusManager;import java.util.HashSet;import java.util.Set;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.KeyStroke;public class T { public static void main(String[] args) { JPanel p = new JPanel(new GridLayout(3,3,5,5)); for (int i = 0; i < 9; i++) { p.add(new JButton("Button-" + (i+1))); } Set<KeyStroke> forwardKeys = new HashSet<KeyStroke>(); Set<KeyStroke> backwardKeys = new HashSet<KeyStroke>(); forwardKeys.add(KeyStroke.getKeyStroke("DOWN")); forwardKeys.add(KeyStroke.getKeyStroke("TAB")); forwardKeys.add(KeyStroke.getKeyStroke("ctrl TAB")); backwardKeys.add(KeyStroke.getKeyStroke("UP")); backwardKeys.add(KeyStroke.getKeyStroke("shift TAB")); backwardKeys.add(KeyStroke.getKeyStroke("ctrl shift TAB")); p.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys); p.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys); JFrame f = new JFrame(); f.getContentPane().add(p, BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); }} 可能大家都误解了我的意思。我是在j2me上用其Canvas来绘制控件。这些控件完全是自己写,没有j2me中ui的任何支持,除了paint和事件,完完全全是基本语法一句一句敲出来的。现在我抽象出几个类:Component、Container、Frame,每个Component有isFocusable和isFocusing,让Container去管理focuse属于谁,而就是这个管理出现了问题。 我用j2me写过一个抛雷的,用canvas写的,我的实现很简单,生成6x6的格子,光标出始化位置在(x=1.y=1),当你按上下左右时,x,y随着++,--,当x=3,y=4时,说明光标在第三行,第四列的位置上。具体实现如下:http://blog.csdn.net/hl_ghost/archive/2008/09/20/2955645.aspx应该可以运行的 谁有《Java开发实战1200例(第Ⅱ卷)》的光盘 小程序一枚 用birt的牛人进啊,大家帮我看一个分组问题 线程同步问题,急,在线等。。。。 奇怪,一日期数据string s="2007-1-1 10:00:00",写入csv文件 后就显示不出来了, 但选定该单元格,显示又正确了,如何解决啊 谢谢 关于编程思想源码! SOS:组件大小和布局管理器 请问大侠们在java中如何将阳历转换为阴历? 小散分:有奖问答,题目见内 向各位北京的兄弟问个问题?欢迎讨论,一律给分 帮我看看我的扫雷小程序问题 java 异常有地方不理解, 请高手指点
让每个控件获得焦点的时候,
if 当前临时变量 is not null and 当前临时变量 不得与自己
当前临时变量.focus();
这个时候就知道下个焦点的控件是谁了,然后
当前临时变量设置为null
同时下个焦点.focus();
大概意思是这样,需要细调下方案2:
可以设置每个控件的index吧。你只要在init里面绑定所有的index和控件对象即可
推荐方案2
而且像j2se焦点的转移是跟位置有关,最左上角的控件先获得焦点,然后往右跑,再往下跑,并不是添加控件的顺序。我自己的想法是:
在每个Container里面有一个控件列表和一个引用focusedComponent指向当前获得焦点的控件,当这个容器获得方向键的事件,则判断focusedComponent是否为null,以及移动的方向,然后改变focusedComponent的值。但问题是,当容器获得方向键的事件,即移动焦点,并且focusedComponent为null时,并不知道焦点从哪个方向来,因为方向键的向上和向下键
可以改变焦点移动的方向。
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.util.HashSet;
import java.util.Set;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;public class T {
public static void main(String[] args)
{
JPanel p = new JPanel(new GridLayout(3,3,5,5));
for (int i = 0; i < 9; i++) {
p.add(new JButton("Button-" + (i+1)));
}
Set<KeyStroke> forwardKeys = new HashSet<KeyStroke>();
Set<KeyStroke> backwardKeys = new HashSet<KeyStroke>();
forwardKeys.add(KeyStroke.getKeyStroke("DOWN"));
forwardKeys.add(KeyStroke.getKeyStroke("TAB"));
forwardKeys.add(KeyStroke.getKeyStroke("ctrl TAB"));
backwardKeys.add(KeyStroke.getKeyStroke("UP"));
backwardKeys.add(KeyStroke.getKeyStroke("shift TAB"));
backwardKeys.add(KeyStroke.getKeyStroke("ctrl shift TAB"));
p.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
p.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
JFrame f = new JFrame();
f.getContentPane().add(p, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
让Container去管理focuse属于谁,而就是这个管理出现了问题。
具体实现如下:
http://blog.csdn.net/hl_ghost/archive/2008/09/20/2955645.aspx
应该可以运行的