5

我有一个问题,当我将鼠标侦听器添加到用作选项卡的组件时,我无法切换选项卡。

这说明了问题:

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class JTabBug {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTabbedPane jTabbedPane = new JTabbedPane();
                jTabbedPane.addTab("Red", new JLabel("Roses"));
                jTabbedPane.addTab("Blue", new JLabel("Skies"));
                jTabbedPane.addTab("Green", new JLabel("Grass"));

                for (int i = 0; i < jTabbedPane.getTabCount(); i++) {
                    JLabel tabComponent = new JLabel(jTabbedPane.getTitleAt(i));

                    tabComponent.addMouseMotionListener(new MouseMotionAdapter() {
                        @Override
                        public void mouseDragged(MouseEvent e) {
                            System.out.println("dragging");
                        }
                    });
                    jTabbedPane.setTabComponentAt(i, tabComponent);
                }

                JFrame jFrame = new JFrame("Testing");
                jFrame.add(jTabbedPane);
                jFrame.setSize(400, 500);
                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
}

拖动按预期打印,但您无法更改选项卡。

4

5 回答 5

1

覆盖contains选项卡组件(在您的情况下为 JLabel)的方法以返回 false。

        public boolean contains(int x, int y)
        {
            return false;
        }
于 2010-12-03T18:29:00.120 回答
0

这似乎可行:请注意,我正在获取已添加的 JLabel,而不是创建要再次添加的新标签。

import javax.swing.*;

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class JTabBug {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTabbedPane jTabbedPane = new JTabbedPane();
                jTabbedPane.addTab("Red", new JLabel("Roses"));
                jTabbedPane.addTab("Blue", new JLabel("Skies"));
                jTabbedPane.addTab("Green", new JLabel("Grass"));

                for (int i = 0; i < jTabbedPane.getTabCount(); i++) {
                  JLabel tabComponent = (JLabel)jTabbedPane.getComponent(i);

                    tabComponent.addMouseMotionListener(new MouseMotionAdapter() {
                        @Override
                        public void mouseDragged(MouseEvent e) {
                            System.out.println("dragging");
                        }
                    });
                }

                JFrame jFrame = new JFrame("Testing");
                jFrame.add(jTabbedPane);
                jFrame.setSize(400, 500);
                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
}
于 2010-12-03T17:59:51.070 回答
0

我的解决方案比 jzd 的要详细一些,我不知道它可以做得这么干净。我喜欢你的解决方案,它认为我有一些新东西。谢谢,jzd。



public class JTabBug
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                final JTabbedPane jTabbedPane = new JTabbedPane();
                jTabbedPane.addTab("Red", new JLabel("Roses"));
                jTabbedPane.addTab("Blue", new JLabel("Skies"));
                jTabbedPane.addTab("Green", new JLabel("Grass"));

                for(int i = 0; i < jTabbedPane.getTabCount(); i++)
                {
                    final JLabel tabComponent = new JLabel(jTabbedPane.getTitleAt(i));

                    tabComponent.addMouseMotionListener(new MouseMotionAdapter()
                    {
                        @Override
                        public void mouseDragged(MouseEvent e)
                        {
                            System.out.println("tabComponent dragging");
                        }
                    });
                    jTabbedPane.setTabPlacement(JTabbedPane.LEFT);

                    tabComponent.addMouseListener(new MouseAdapter()
                    {
                        @Override
                        public void mousePressed(MouseEvent e)
                        {
                            int x =  tabComponent.getLocationOnScreen().x - jTabbedPane.getLocationOnScreen().x;
                            int y =  tabComponent.getLocationOnScreen().y - jTabbedPane.getLocationOnScreen().y;
                            MouseEvent me = new MouseEvent(
                                    (JLabel)e.getSource(),
                                    e.getID(), e.getWhen(), e.getModifiers(), 
                                    x, y,
                                    e.getLocationOnScreen(). x, e.getLocationOnScreen().y, 
                                    e.getClickCount(), e.isPopupTrigger(),
                                    e.getButton());                             
                            jTabbedPane.getMouseListeners()[0].mousePressed(me);
                            System.out.println("tabComponent mousePressed e="+e);
                        }
                    });
                    jTabbedPane.setTabComponentAt(i, tabComponent);
                }
                JFrame jFrame = new JFrame("Testing");
                jFrame.add(jTabbedPane);
                jFrame.setSize(400, 500);
                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
}

享受吧,波罗

于 2011-04-06T17:32:26.113 回答
0

我不认为这是一个错误,因为它正在做我所期望的。您正在为选项卡(一个 JLabel)创建一个新组件,将一个运动侦听器附加到它,然后将其设置为选项卡。您没有向标签添加鼠标单击侦听器,这会导致选项卡更改,所以我不希望它存在。原始选项卡组件处理此鼠标单击事件,因此如果您可以访问该组件,请尝试复制它(或者只是访问该组件并添加鼠标运动适配器)。如果这是不可能的,只需自己处理点击事件。

于 2010-12-03T18:07:32.123 回答
0

如果新选项卡组件具有另一个侦听器,则鼠标事件似乎不会更改选项卡的选择。不知道为什么这是因为新的标签选项卡组件在没有鼠标运动侦听器的情况下工作。如果您添加另一个鼠标侦听器来更改选择:

                final int index = i;
                tabComponent.addMouseListener(new MouseAdapter() {                      
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        jTabbedPane.setSelectedIndex(index);
                    }             

                });

你得到了想要的结果,但这似乎是一个奇怪的解决方法。

于 2010-12-03T18:16:50.750 回答