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