Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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.focusGaind和Lost don';不行?_Java_Swing_Events_Jpanel - Fatal编程技术网

Java 为什么JPanel.focusGaind和Lost don';不行?

Java 为什么JPanel.focusGaind和Lost don';不行?,java,swing,events,jpanel,Java,Swing,Events,Jpanel,请看下面的代码(我故意错过了导入) 我创建了这个类来测试它,然后在我的主代码中添加了onFocusListener,但是它没有按照我期望的方式工作。请告诉我出了什么问题,或者这是正确的EvenetListener 默认情况下,JPanel不可聚焦。如果您想在它们上使用FocusListener,首先必须通过setFocusable(true)更改此属性 但即使你这么做了,FocusListener也不是你想要的 相反,我想听听JTabbedPane的模型来了解变化。它使用SingleSelect

请看下面的代码(我故意错过了导入)

我创建了这个类来测试它,然后在我的主代码中添加了onFocusListener,但是它没有按照我期望的方式工作。请告诉我出了什么问题,或者这是正确的EvenetListener

  • 默认情况下,JPanel不可聚焦。如果您想在它们上使用FocusListener,首先必须通过
    setFocusable(true)
    更改此属性
  • 但即使你这么做了,FocusListener也不是你想要的
  • 相反,我想听听JTabbedPane的模型来了解变化。它使用SingleSelectionModel,您可以将ChangeListener添加到此模型,侦听更改,检查当前显示的组件,如果您的组件出现问题,则进行响应
  • 您正在使用设置边界和空布局,如果您计划创建和维护的不仅仅是一个玩具Swing程序,那么您应该避免这样做

  • 编辑
    例如:

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import javax.swing.*;
    import javax.swing.event.*;
    
    @SuppressWarnings("serial")
    public class MainPanel extends JPanel {
       private static final int PREF_W = 450;
       private static final int PREF_H = 300;
       private static final int GAP = 5;
       private static final int TAB_COUNT = 5;
    
       private JTabbedPane tabbedPane = new JTabbedPane();
    
       public MainPanel() {
          for (int i = 0; i < TAB_COUNT; i++) {
             JPanel panel = new JPanel();
             panel.add(new JButton("Button " + (i + 1)));
             panel.setName("Panel " + (i + 1));
             tabbedPane.add(panel.getName(), panel);         
          }
    
          setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
          setLayout(new BorderLayout());
          add(tabbedPane, BorderLayout.CENTER);
    
          tabbedPane.getModel().addChangeListener(new ChangeListener() {
    
             @Override
             public void stateChanged(ChangeEvent evt) {
                Component component = tabbedPane.getSelectedComponent();
                System.out.println("Component Selected: " + component.getName());
             }
          });
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       private static void createAndShowGui() {
          MainPanel mainPanel = new MainPanel();
    
          JFrame frame = new JFrame("MainPanel");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    导入java.awt.BorderLayout;
    导入java.awt.Component;
    导入java.awt.Dimension;
    导入javax.swing.*;
    导入javax.swing.event.*;
    @抑制警告(“串行”)
    公共类主面板扩展了JPanel{
    私有静态最终整型参数W=450;
    私有静态最终整型参数H=300;
    专用静态最终内部间隙=5;
    私有静态最终整数选项卡计数=5;
    private JTabbedPane tabbedPane=新JTabbedPane();
    公共主面板(){
    对于(int i=0;i
    JPanel
    是一个轻量级容器,它不是一个可操作的组件,因此不会获取焦点事件。由于swing组件的层次结构,它允许您添加焦点侦听器。要获取选项卡所选事件,您需要使用
    JTabbedPane#addChangeListener


    希望这能有所帮助。

    @downvorters:你能告诉我从我的错误中吸取教训的原因吗?
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import javax.swing.*;
    import javax.swing.event.*;
    
    @SuppressWarnings("serial")
    public class MainPanel extends JPanel {
       private static final int PREF_W = 450;
       private static final int PREF_H = 300;
       private static final int GAP = 5;
       private static final int TAB_COUNT = 5;
    
       private JTabbedPane tabbedPane = new JTabbedPane();
    
       public MainPanel() {
          for (int i = 0; i < TAB_COUNT; i++) {
             JPanel panel = new JPanel();
             panel.add(new JButton("Button " + (i + 1)));
             panel.setName("Panel " + (i + 1));
             tabbedPane.add(panel.getName(), panel);         
          }
    
          setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
          setLayout(new BorderLayout());
          add(tabbedPane, BorderLayout.CENTER);
    
          tabbedPane.getModel().addChangeListener(new ChangeListener() {
    
             @Override
             public void stateChanged(ChangeEvent evt) {
                Component component = tabbedPane.getSelectedComponent();
                System.out.println("Component Selected: " + component.getName());
             }
          });
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       private static void createAndShowGui() {
          MainPanel mainPanel = new MainPanel();
    
          JFrame frame = new JFrame("MainPanel");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }