swing - Java Layout with Component always in Top Right -


the primary gui of application composed of jdesktoppane @ center of frame's content pane using borderlayout. hoping have component placed in top right of screen still allows user drag jinternalframes within space left , and bottom of component.

setting component north or east of borderlayout seems fill entire space. thinking borderlayout may not best layout manager trying accomplish? suggestions on better approach?

check out overlaylayout. allows stack components on top of 1 another.

you need manipulate setalignmentx(..) , setalignmenty(...)` methods layout want. not intuitive how these alignments work setting component top/left relatively easy.

here little demo play with:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*;  public class overlaylayouttest extends jpanel     implements actionlistener {     jpanel green;     jpanel red;     jlabel greenlabel;     jlabel redlabel;     jcombobox  greenalignmentx;     jcombobox  greenalignmenty;     jcombobox  redalignmentx;     jcombobox  redalignmenty;      public overlaylayouttest()     {         setlayout( new borderlayout(10, 10) );         add(createnorthpanel(), borderlayout.north);         add(createcenterpanel(), borderlayout.center);         add(createsouthpanel(), borderlayout.south);     }      private jpanel createnorthpanel()     {         jpanel panel = new jpanel();          panel.add( new jlabel("green:") );         greenlabel = new jlabel();         panel.add( greenlabel );          panel.add( new jlabel("red:") );         redlabel = new jlabel();         panel.add( redlabel );          return panel;     }      private jpanel createcenterpanel()     {          jpanel panel = new jpanel();         panel.setlayout( new overlaylayout(panel) );         panel.setbackground( color.orange );         panel.setpreferredsize( new dimension(200, 200) );          red = new jpanel();         red.setbackground( color.red );         red.setpreferredsize( new dimension(50, 50) );         red.setmaximumsize( red.getpreferredsize() );         red.setminimumsize( red.getpreferredsize() );         panel.add( red );          green = new jpanel();         green.setbackground( color.green );         green.setpreferredsize( new dimension(100, 100) );         green.setmaximumsize( green.getpreferredsize() );         green.setminimumsize( green.getpreferredsize() );         panel.add( green );          jpanel wrap = new jpanel();         wrap.add( panel );         return wrap;     }      private jpanel createsouthpanel()     {         jpanel panel = new jpanel( new gridlayout(1, 0, 10, 10) );          jpanel green = new jpanel(new gridlayout(0, 2, 5, 5) );         green.setborder( new titledborder("green alignment") );         green.add( new jlabel("x alignment:") );         greenalignmentx = createcombobox();         green.add( greenalignmentx );         green.add( new jlabel("y alignment:") );         greenalignmenty = createcombobox();         green.add( greenalignmenty );         panel.add( green );          jpanel red = new jpanel(new gridlayout(0, 2, 5, 5) );         red.setborder( new titledborder("red alignment") );         red.add( new jlabel("x alignment:") );         redalignmentx = createcombobox();         red.add( redalignmentx );         red.add( new jlabel("y alignment:") );         redalignmenty = createcombobox();         red.add( redalignmenty );         panel.add( red );          jbutton reset = new jbutton("reset alignment");         reset.addactionlistener( );         panel.add( reset );           return panel;     }      public void actionperformed(actionevent e)     {         green.setalignmentx( ((float)greenalignmentx.getselecteditem()) );         green.setalignmenty( ((float)greenalignmenty.getselecteditem()) );         red.setalignmentx( ((float)redalignmentx.getselecteditem()) );         red.setalignmenty( ((float)redalignmenty.getselecteditem()) );         jpanel parent = (jpanel)green.getparent();         parent.revalidate(); /*         system.out.print(green.getalignmentx() + " : ");         system.out.print(green.getalignmenty() + " : ");         system.out.print(red.getalignmentx() + " : ");         system.out.print(red.getalignmenty() + " : ");         system.out.println(); */         swingutilities.invokelater(new runnable()         {             public void run()             {                 greenlabel.settext( green.getlocation().tostring() );                 redlabel.settext( red.getlocation().tostring() );             }         });      }      private jcombobox createcombobox()     {         jcombobox<float> combobox = new jcombobox<float>();          combobox.additem( new float(0f) );         combobox.additem( new float(0.25f) );         combobox.additem( new float(0.5f) );         combobox.additem( new float(0.75f) );         combobox.additem( new float(1.0f) );         combobox.setselecteditem(0.5f);          return combobox;     }      private static void createandshowui()     {         jframe frame = new jframe("overlaylayouttest");         frame.setdefaultcloseoperation(jframe.exit_on_close);         frame.add( new overlaylayouttest() );         frame.pack();         frame.setlocationbyplatform( true );         frame.setvisible( true );     }      public static void main(string[] args)     {         eventqueue.invokelater(new runnable()         {             public void run()             {                 createandshowui();             }         });     } } 
  1. set alignment x values 1.0 both components
  2. set alignment y values 0.0 both components

and should layout want.

edit:

missed part dragging jinternalframe. imples using jdesktoppane support dragging. jdesktoppane uses null layout allow drag components around.

there no reason can't add component (other jinternalframe) desktop. need set size/location of component displayed @ top right of desktop. need add componentlistener desktop pane listen componentresized event. when event fired need recalucate location of component reset top right.


Comments