【问题标题】:JTabbedPane trigger eventJTabbedPane 触发事件
【发布时间】:2014-06-03 16:42:16
【问题描述】:

我想在单击“+”选项卡时触发一个事件(并且没有其他选项卡存在)。基本上,我希望“+”选项卡像一个按钮。我不太确定要使用哪种类型的侦听器。我该怎么做?

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class JTPTest extends JTabbedPane {



    public JTPTest() {

        this.addChangeListener(new ChangeListener() {

            public void stateChanged(ChangeEvent changeEvent) {
                System.out.println(changeEvent);
            }

        });

        JPanel blankJPanel = new JPanel();
        this.addTab("+", blankJPanel);

    }

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

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new JTPTest());

                frame.setSize(500, 500);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);

            }
        });

    }
}

【问题讨论】:

    标签: java swing actionlistener jtabbedpane changelistener


    【解决方案1】:

    阅读 How to Use Tabbed Panes 上的 Swing 教程部分。

    其中一个示例显示了如何向选项卡添加“关闭”按钮。您应该能够轻松修改代码以添加“+”按钮。

    【讨论】:

    • 这不是我要问的。我想在单击 + 选项卡并且它是唯一的选项卡时触发一个事件。
    • @dubdubdubdot, but I want the + to invoke a listener (acting like a button) when there is only 1 tab. 您当前的代码不起作用,因为当您只有一个选项卡时不会生成 ChangeEvent。无论您在选项卡式窗格中有多少个选项卡,单击“+”按钮都会调用“+”按钮的 ActionListener。
    • 我明白你的意思,但我希望标签本身就像一个按钮,而不是标签上的按钮。
    • @dubdubdubdot,您不必添加按钮。您可以添加任何组件。或者你可以添加一个没有边框的按钮,这样看起来就像一个带有文本的普通标签。
    【解决方案2】:

    试试:

    JPanel blankJPanel1 = new JPanel();
    this.addTab("+", blankJPanel1);
    
    setModel(new DefaultSingleSelectionModel() {
    
        @Override
        public void setSelectedIndex(int index) {
            System.out.println("woah!");
        }
    });
    

    更新

    只是一个替代版本,不需要修改模型行为。

    JPanel blankJPanel = new JPanel();
    this.addTab("dummy text", blankJPanel);
    
    JLabel label = new JLabel("x");
    label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
    label.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            System.out.println("woah!!");
        }
    });
    
    
    setTabComponentAt(indexOfComponent(blankJPanel), label);
    

    更新 2 看来我最终会做类似于 answer 的事情,请将其称为解决此问题的“最佳”解决方案。

    【讨论】:

    • 所以,是的,当您有多个选项卡时可以使用...但是我希望 + 在只有 1 个选项卡时调用侦听器(充当按钮)。我更新了问题以使其更清楚。感谢您的帮助。
    • 编辑了问题。我相信您无法在选项卡上建立侦听器,因为没有进行新的选择。相反,您可以覆盖选择模型上的行为。
    • 谢谢...这与我正在寻找的非常接近。唯一的问题是该事件仅在第一次单击选项卡时发生。关于如何使其可重复的任何想法?
    • 再次编辑。通过删除默认行为“super.setSelectedIndex(index);”多次单击时选择不断重复。
    • 将 ChangeListener 添加到选项卡式窗格将实现相同的目的,而无需替换 SelectionModel,如果您因其他原因需要替换 SelectionModel,这可能会导致问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2015-07-08
    • 2012-07-28
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多