当前位置: 首页 > 知识库问答 >
问题:

JTabbedPane中组件的焦点

公羊俭
2023-03-14

我对此完全陌生.....

问题是,当我切换到任何选项卡时,我无法获得正常的jpanel效果。按钮不能用鼠标点击(可以通过按tab键选择按钮n然后按space键点击),文本字段不能在鼠标点击时选择(只能通过按tab键选择)等。

那么对此有什么解决办法吗??我希望jtabbedpane中的面板像普通jpanel一样工作:)谢谢:)

共有1个答案

关宏毅
2023-03-14

没有任何MCVE是很难帮助的,所以我做了一个简单的例子应用程序,我希望,适合您的应用程序。

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class MainFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static MainFrame frame;

    private MainFrame() {
        this.setTitle("Focus on JTabbedPane");
        this.setSize(new Dimension(800, 600));

        this.getContentPane().add(initComponents());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private JPanel initComponents() {
        JPanel panel = new JPanel(new BorderLayout(10, 10));
        panel.add(new MyInfoPanel(), BorderLayout.NORTH);
        panel.add(new MyTabPanel(), BorderLayout.CENTER);

        return panel;
    }

    public static void createAndShowGui() {
        frame = new MainFrame();
        frame.setVisible(true);
    }



}

第一个只有信息文本的JPanel

import javax.swing.JLabel;
import javax.swing.JPanel;


public class MyInfoPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public MyInfoPanel() {
        this.add(new JLabel("Some info text"));
    }

}

MyTabbedPanel

import javax.swing.JTabbedPane;


public class MyTabPanel extends JTabbedPane {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public MyTabPanel() {
        this.addTab("Tab 1", new FirstTabPanel());
        this.addTab("Tab 2", new SecondTabPanel());
    }

}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class FirstTabPanel extends JPanel implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JButton button;
    JTextField tf;
    public FirstTabPanel() {
        tf = new JTextField("Textfield");
        this.add(tf);
        button = new JButton("Button");
        button.addActionListener(this);
        this.add(button);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(button)) {
            tf.setText("Button on was clicked!");
        }
    }
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class SecondTabPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    JTextArea area;
    JTextField field;

    public SecondTabPanel() {

        this.setLayout(new BorderLayout(10, 10));

        field = new JTextField();
        this.add(field, BorderLayout.NORTH);
        area = new JTextArea();
        this.add(area, BorderLayout.CENTER);
        field.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyPressed(KeyEvent e) {
                area.setText(area.getText() + e.getKeyChar());
            }
        });
    }


}

然后启动它

import javax.swing.SwingUtilities;


public class App {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MainFrame.createAndShowGui();
            }
        });
    }
}

希望这款迷你应用能帮到你。

 类似资料:
  • 我正在用Java编程一个聊天客户机,在那里我希望有一个单独的JDialog用于所有打开的聊天。所以我决定使用一个JTabbedPane,其中一个选项卡代表一个单独的聊天。 我在每个选项卡中都放了一个JPanel,它只包含一个用于消息历史记录的JTextPane和一个用户输入消息的JTextArea。 为了更好的可用性,我实现了一个特性,当 打开新的ChatTab 用户在chattab之间进行更改(

  • 我有一个JTabbed面板,它有4个选项卡。每个选项卡都有一个 JTable。我正在尝试为JTabbedPane设计一个自定义的焦点移动策略,这样当我专注于表格的最后一个单元格时,按Tab会将我带到下一个标签。我已经搜索了很多,但没有找到我可以使用的特定内容。 以下是我的自定义焦点遍历策略。 此外,这些JTables正在其他地方实例化,我已经覆盖了Tab键绑定,以便在最后一个单元格上专注于下一个组

  • 我正在尝试实现 J 选项卡面板。在下面的代码中,我提出了一个与我想要实现的非常相似的案例。我通过将JPanel添加到J选项卡面板来创建了一个选项卡。我已经在JPanel中添加了一个J巴顿和JScrollPane。在单击 J 按钮时,我想添加一个新的 JPanel,其中包含一些 JRadio 按钮到 JScrollPane 中。但是,即使在刷新 JScrollPane 或主 JPanel 之后,这些

  • 我正在尝试更新我编写的程序的GUI。在新的GUI上,我有一个JFrame,其中包含一个JPanel,它有一个JTabbedPane和上面的两个按钮。 在JTabbedPane中,我有三个JPanel,其中包含不同的组件。(如按钮、文本字段等)所以现在我必须让所有组件根据类型对其执行相同的操作。 如果有一个文本字段,我必须做一些事情,但如果有一个按钮,我必须做其他事情。 所以之前我做过这样的事情:

  • 问题内容: 我有一个带有自定义标签的组件。该组件包含(显示标签标题)和(关闭按钮)。当我在停止接收鼠标事件的站点中更改文本时,如果直接单击标签,则无法再选择该选项卡,而如果单击标签周围,则可以选择该选项卡。有任何想法吗? 一段代码: 问题答案: 问题与我进行更多挖掘之后在此处发布的问题有关:setToolTipText消耗鼠标事件的解决方法?

  • 返回NULL。在选择JTabbedPane旁边的一个JPanel后直接调用它,这是我能想到的方法返回空组件的唯一原因;因为选项卡已打开但没有焦点。 然而,我需要找到一种方法来获得JTabbedPane中打开的选项卡。 而且,始终返回NULL。有6个标签。 getSelectedIndex()返回了正确的索引,但如果我传入该索引,它仍然表示组件为null。