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

タブ コンポーネント (この場合は JLabel)のメソッドをオーバーライドしてcontainsfalse を返します。

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

新しいタブコンポーネントに別のリスナーがある場合、マウスイベントはタブの選択を変更しないようです。新しいラベル タブ コンポーネントがマウス モーション リスナーなしで動作するため、これがなぜなのかはわかりません。別のマウス リスナーを追加して選択を変更する場合:

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

                });

望ましい結果が得られますが、これは奇妙な回避策のようです。

于 2010-12-03T18:16:50.750 に答える
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);
            }
        });
    }
}
于 2010-12-03T17:59:51.070 に答える
0

期待どおりの動作をしているので、これはバグではないと思います。タブ用の新しいコンポーネント (JLabel) を作成し、それにモーション リスナーをアタッチして、それをタブとして設定します。タブを変更するラベルにマウスクリックリスナーを追加していないので、これがあるとは思いません。元のタブ コンポーネントはこのマウス クリック イベントを処理するため、そのコンポーネントにアクセスできる場合は、可能であればコピーしてみてください (または、そのコンポーネントにアクセスしてマウス モーション アダプターを追加するだけです)。これが不可能な場合は、クリック イベントを自分で処理してください。

于 2010-12-03T18:07:32.123 に答える
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 に答える