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 / GUI / January 2008

Tip: Looking for answers? Try searching our database.

JPopupMenu positioning

Thread view: 
Sabine Dinis Blochberger - 22 Jan 2008 12:30 GMT
JPopupMenu positioning

I have a button, which, when clicked, should show a popup menu alignd
with its lower right corner.

The issue is that the popup menu shows in a wrong place with the first
click on the button, and in the correct one on every subsequent click,
even when moving or resizing the window.

source to display the problem:
-snip-
public class NewJFrame extends javax.swing.JFrame {
   
   /** Creates new form NewJFrame */
   public NewJFrame() {
       initComponents();
   }
   
   private void initComponents() {

       jPopupMenu1 = new javax.swing.JPopupMenu();
       jMenuItem1 = new javax.swing.JMenuItem();
       jMenuItem2 = new javax.swing.JMenuItem();
       jButton1 = new javax.swing.JButton();

       jMenuItem1.setText("Item 1");
       jPopupMenu1.add(jMenuItem1);

       jMenuItem2.setText("Item 2");
       jPopupMenu1.add(jMenuItem2);
 
       setDefaultCloseOperation(javax.swing.WindowConstants
            .EXIT_ON_CLOSE);

       jButton1.setText("jButton1");
       jButton1.addActionListener(new
               java.awt.event.ActionListener() {
           public void actionPerformed(java.awt.event.ActionEvent
                   evt) {
               jButton1ActionPerformed(evt);
           }
       });

       javax.swing.GroupLayout layout = new
               javax.swing.GroupLayout(getContentPane());
       getContentPane().setLayout(layout);
       layout.setHorizontalGroup(
               layout.createParallelGroup(javax
               .swing.GroupLayout.Alignment.LEADING)
               .addGroup(javax.swing.GroupLayout.Alignment
               .TRAILING, layout.createSequentialGroup()
               .addContainerGap(206, Short.MAX_VALUE)
               .addComponent(jButton1)
               .addContainerGap())
       );
       layout.setVerticalGroup(
         
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
           .addGroup(layout.createSequentialGroup()
               .addContainerGap()
               .addComponent(jButton1)
               .addContainerGap(219, Short.MAX_VALUE))
       );

       pack();
   }

   private void jButton1ActionPerformed(java.awt.event.ActionEvent
           evt) {
       // show the popupmenu
       jPopupMenu1.show(jButton1, jButton1.getWidth() -
               jPopupMenu1.getWidth(),
               jButton1.getHeight());
   }
   
   /**
    * @param args the command line arguments
    */
   public static void main(String args[]) {
       java.awt.EventQueue.invokeLater(new Runnable() {
           public void run() {
               new NewJFrame().setVisible(true);
           }
       });
   }
   
   private javax.swing.JButton jButton1;
   private javax.swing.JMenuItem jMenuItem1;
   private javax.swing.JMenuItem jMenuItem2;
   private javax.swing.JPopupMenu jPopupMenu1;
}
-snip-

Any way to make it behave the way I want to (show up in the correct
place on the first try)? I have tried

JFrame.invalidate()
JFrame.validate()
JFrame.pack()

JPopupMenu.invalidate()
JPopupMenu.validate()
JPopupMenu.pack()

I also tried to set the popup menus on screen location directly, but
never found out how to get the correct point. This might be a possible
solution, to call jPopupMenu1.setLocation().

Thanks again.
Signature

Sabine Dinis Blochberger

Op3racional
www.op3racional.eu

Thomas Fritsch - 23 Jan 2008 12:04 GMT
Sabine Dinis Blochberger schrieb:
> JPopupMenu positioning
>
[quoted text clipped - 6 lines]
>
> source to display the problem:
[...]
>     private void jButton1ActionPerformed(java.awt.event.ActionEvent
>             evt) {
[quoted text clipped - 3 lines]
>                 jButton1.getHeight());
>     }
[...]
I've reproduced your problem. In the debugger I saw:
When the method is called for the first time, jPopupMenu1.getWidth()
returns 0, because the popup (a package-private member variable in
JPopupMenu) is not yet realized.
When it is called the for second/third/... time, jPopupMenu1.getWidth()
returns 20, and all is fine.

> Any way to make it behave the way I want to (show up in the correct
> place on the first try)? I have tried
[...]
> JPopupMenu.pack()
I tried that, too, and didn't succeed.
Looking into JPopupMenu's source code, you see that JPopupMenu.pack() is
essentially a no-op, when JPopupMenu's popup member is not yet realized.

> I also tried to set the popup menus on screen location directly, but
> never found out how to get the correct point. This might be a possible
> solution, to call jPopupMenu1.setLocation().
I would take a pragmatic route, and decide to display the popup menu
*left*-aligned, instead of *right*-aligned to the button:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent
            evt) {
        // show the popupmenu
        jPopupMenu1.show(jButton1, 0, jButton1.getHeight());
    }
I know this is not quite what wanted, but at least it behaves consistently.

Signature

Thomas

Sabine Dinis Blochberger - 23 Jan 2008 12:47 GMT
> Sabine Dinis Blochberger schrieb:

> [...]
> I've reproduced your problem. In the debugger I saw:
[quoted text clipped - 3 lines]
> When it is called the for second/third/... time, jPopupMenu1.getWidth()
> returns 20, and all is fine.

That is a great insight!

I have tried figuring out the location for the menu after the call to
show (using setLocation()), but was having problem determining the Point
(on screen, or in relation to the frame). I suspect SwingUtilities might
help with the conversion of coordinate spaces.

> > I also tried to set the popup menus on screen location directly, but
> > never found out how to get the correct point. This might be a possible
[quoted text clipped - 7 lines]
>      }
> I know this is not quite what wanted, but at least it behaves consistently.

Yes, that is what I will put inplace now, until I get more time to
fiddle, which is probably never <g>.

Thank you very much for your time, Thomas.

Signature

Sabine Dinis Blochberger

Op3racional
www.op3racional.eu



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.