标签组件消耗鼠标,因此标签不会更改

时间:2010-12-03 17:45:06

标签: java swing jtabbedpane

我遇到一个问题,当我将鼠标监听器添加到用作标签的组件时,我无法切换标签。

这表明了问题:

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);
            }
        });
    }
}

拖动按预期打印出来,但您无法更改标签。

5 个答案:

答案 0 :(得分:0)

这似乎有效:请注意,我正在添加已添加的JLabel,而不是创建一个新添加的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);
            }
        });
    }
}

答案 1 :(得分:0)

我不认为这是一个错误,因为它正在做我期望的事情。您正在为选项卡(JLabel)创建一个新组件,将运动侦听器附加到该选项卡,然后将其设置为选项卡。你没有在标签上添加鼠标点击监听器,这会导致标签发生变化,所以我不希望它出现在那里。原始选项卡组件处理此鼠标单击事件,因此,如果您可以访问该组件,请尝试复制它(如果可以)(或只是访问该组件并添加鼠标移动适配器)。如果无法做到这一点,请自行处理点击事件。

答案 2 :(得分:0)

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

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

                });

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

答案 3 :(得分:0)

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

        public boolean contains(int x, int y)
        {
            return false;
        }

答案 4 :(得分: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);
            }
        });
    }
}

享受,Boro