无法关注JScrollPane?

时间:2011-08-23 06:07:50

标签: java swing focus jscrollpane

我遇到了关注JScrollPane的问题。我正在尝试在创建窗口时执行此操作,以便我可以尝试我正在处理的键绑定。一切都显示出应有的位置和正确的尺寸。我得到的是这样的:

import java.awt.*;
import java.swing.*;

public class MyInterface extends JFrame {
   public MyInterface() {}

   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }

   private static void createAndShowGUI() {
      // define custom table model
      JTable table = new JTable(model);
      MyScrollPane scrollPane = new MyScrollPane(table);
      MyInterface frame = new MyInterface();
      scrollPane.setPreferredSize(new Dimension(512, 512));
      frame.getContentPane().add(scrollPane);
      frame.pack();
      frame.setVisible();
      scrollPane.requestFocus();
   }
}

public class MyScrollPane extends JScrollPane implements KeyListener {
   public MyScrollPane(Component view) {
      super(view, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
   }

   // key event processing
}

我尝试在框架中添加一个窗口监听器,它会在窗口打开后请求焦点滚动,但它没有帮助。有什么想法吗?

编辑:我想我应该提一下,scrollPane.isFocusable()和scrollPane.isRequestFocusEnabled都返回true,所以我应该能够给它焦点。

编辑:似乎我无法将注意力集中在任何(框架,桌子等)上,所以这里还有其他一些问题。无论我尝试什么,这都显示为null:

Component compFocusOwner =   KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
System.out.println("focus owner: " + compFocusOwner);

4 个答案:

答案 0 :(得分:4)

你为什么需要这个?我认为你应该把重点放在JScrollPane中的组件上。你怎么发现焦点不在那里? Scrollpane本身没有可见的部分(可能只有1个像素的框架可见)。

答案 1 :(得分:4)

我认为不可能将Focus设置为JScrolPane,但将Focus设置为JComponent,这是放入JScrolPane的问题

    Runnable doRun = new Runnable() {

        @Override
        public void run() {
            myComponent.requestFocus();//requestFocusInWindow
            myComponent.grabFocus();
        }
    };
    SwingUtilities.invokeLater(doRun);

答案 2 :(得分:3)

How to Use Key Bindings: How Key Bindings Work所述,复合组件通常使用WHEN_ANCESTOR_OF_FOCUSED_COMPONENT地图。您甚至可以将绑定添加到顶级组件的根窗格,如Key Bindings所示。

答案 3 :(得分:0)

我不知道问题是什么;由于缺乏更好的想法,我删除并重新输入所有内容,现在它可以正常工作。它可以聚焦JScrollPane,以防任何人阅读这个愿望。我认为这是可能的,因为默认情况下.isFocusable()和isRequestFocusEnabled()都设置为true。但是,我不知道;至少我得到了一些关键绑定的好链接。谢谢你的帮助!