Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / September 2006

Tip: Looking for answers? Try searching our database.

Detecting Mouse Over Tab on JTabbedPane

Thread view: 
Hal Vaughan - 03 Sep 2006 09:26 GMT
I tried finding this and hope I've missed the obvious or that it's something
easy I just didn't find.

I know I can set tool tips for a tab on a JTabbedPane object.  I'd like to
have a "help" JTextArea off to the side of my main interface to use to
provide more info than I can in a tool tip.  Ideally, when the user puts
the mouse pointer over a tab, I'd like to have a listener that will detect
that and change the text in the help section.  In other words, I need to be
able to make an actionlistener that will know when the pointer is over a
tab (not when it changes or is clicked on).

Is that possible?

Thanks!

Hal
Michael Rauscher - 03 Sep 2006 12:39 GMT
Hal Vaughan schrieb:
> I tried finding this and hope I've missed the obvious or that it's something
> easy I just didn't find.
[quoted text clipped - 8 lines]
>
> Is that possible?

Sure. It's a MouseMotionListener you'll have to add to the JTabbedPane
instance, e. g. something like this one:

MouseMotionListener listener = new MouseMotionAdapter() {
    private int oldIx = -1;

    public void mouseMoved( MouseEvent e ) {
        JTabbedPane tp = (JTabbedPane)e.getSource();
        int ix = tp.indexAtLocation( e.getX(), e.getY() );

        if ( ix == oldIx )
            return;

        oldIx = ix;

        if ( ix == -1 )
            return;

        doSomethingUseful();
    }
};

Bye
Michael
Hal Vaughan - 03 Sep 2006 17:00 GMT
> Hal Vaughan schrieb:
>> I tried finding this and hope I've missed the obvious or that it's
[quoted text clipped - 35 lines]
> Bye
> Michael

I tried adding this like this:

addMouseMotionListener(new MouseMotionAdapter() {...});

(The ... contained all the code above.)  I replaced "doSomethingUseful()"
with "System.out.println("Tab index: " + ix)" and it never printed
anything, so I finally added "System.out.println("Movement...");" before
the line to get the JTabbedPane from the event and never got a printout
from there.

Is there another step I need to do to make sure I actually get the info or
that the listener is called?

Thanks!

Hal
Michael Rauscher - 03 Sep 2006 17:17 GMT
Hi,

Hal Vaughan schrieb:

> (The ... contained all the code above.)  I replaced "doSomethingUseful()"
> with "System.out.println("Tab index: " + ix)" and it never printed
> anything, so I finally added "System.out.println("Movement...");" before
> the line to get the JTabbedPane from the event and never got a printout
> from there.

Most probably didn't add the mouse motion listener to the tabbed pane...

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

public class Test  {
    private MouseMotionListener listener = new MouseMotionAdapter() {
        private int oldIx = -1;

        public void mouseMoved( MouseEvent e ) {
            JTabbedPane tp = (JTabbedPane)e.getSource();
            int ix = tp.indexAtLocation( e.getX(), e.getY() );

            if ( ix == oldIx )
                return;

            oldIx = ix;

            if ( ix == -1 )
                return;

            System.out.println("You're over tab " + ix );
        }
    };

    private void createAndShowGUI() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addMouseMotionListener( listener );

        tabbedPane.addTab( "Tab 1", new JPanel() );
        tabbedPane.addTab( "Tab 2", new JPanel() );

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        frame.getContentPane().add( tabbedPane );
        frame.pack();
        frame.setVisible(true);
    }

    public static final void main( String args[] ) {
        new Test().createAndShowGUI();
    }
}

Bye
Michael
Hal Vaughan - 03 Sep 2006 17:19 GMT
>> Hal Vaughan schrieb:
>>> I tried finding this and hope I've missed the obvious or that it's
[quoted text clipped - 49 lines]
> Is there another step I need to do to make sure I actually get the info or
> that the listener is called?

Nevermind this last part.  I was using an example I downloaded from online
for a quick JTabbedPane example and between cutting and pasting in my
browser to my editor, the indentation got messed up and I lost track of
which object I was adding the listener to.  (HINT: Never name objects, even
in short code, "myObject" or something too generic and always keep
indentations lined up!)

Okay, I had seen the indication of indexAtLocation(), but misunderstood it.
I thought it would report the entire pane and not just a tab, which would
be useless, since whenever the mouse was over the pane, it would report the
number of the active pane.  I was also hoping there would be something a
bit more direct, but this works perfectly.  It only reports anything when
the pointer is directly over a tab, or a -1 if it's not over one.  I
changed the method to:

int lastIdx = -1;
JLabel tabIndex = new JLabel("");

public void mouseMoved( MouseEvent e ) {
       JTabbedPane tp = (JTabbedPane)e.getSource();
       int idx = tp.indexAtLocation( e.getX(), e.getY() );
       if (idx == lastIdx) return;
       tabIndex.setText(String.valueOf(idx));
       return;
}

I also just added "implements MouseMotionListener" to the main class I was
using and added a mouseDragged() method so that'd work so it'd all be in
one class and the variables and components were easier to track.

This works as a dry run for what I want to do because it changes the text of
a component to something specific based on the tab the cursor is over.
When I get the real thing working, I'll make the JTextArea I'm using for a
help section start with the help text for the default selected panel.  That
way the user has instant help and the help will change whenever they change
the tab or mouse over one to change it.

Thanks for the help!  This does exactly what I wanted and is easy to
implement.

Hal
Michael Rauscher - 03 Sep 2006 18:11 GMT
Hal Vaughan schrieb:

> I also just added "implements MouseMotionListener" to the main class I was
> using and added a mouseDragged() method so that'd work so it'd all be in
> one class and the variables and components were easier to track.

I'd suggest to create a separate class for that job - without any
components. This way you can reuse it easily.

Bye
Michael


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.