GridbagLayout - how to get the size of a gridbag cell?

Hi,
i'd like to create a swing widget that automatically rescales the labels inside according to its cell size.
Therefore i had the idea to get the cell size and set the font size according to this size ( subtracting some inset )
finally it should look like that:
|     title text    |
|   val1  |  val2   |
|   val3  |  val4   |
-----------------------the title needs to span 2 cells horizontal,
the values (valx) span 1 cell
by resizing the mainPanel, the labels should also resize according to their available space.
i use this code by now for setting up the widget.
// title label
GridBagConstraints gBC_title = new GridBagConstraints();
jl_title.setFont(titleFont);
gBC_title.gridx = 0;
gBC_title.gridy = 0;
gBC_title.gridwidth = 2; // grid spanning
gBC_title.weightx = 1;
gBC_title.weighty = 0.2;
gBC_title.anchor = GridBagConstraints.CENTER;
gBC_title.fill = GridBagConstraints.BOTH;              
mainPanel.add(jl_title, gBC_title); 
//one of the value labels
GridBagConstraints gBC_v1 = new GridBagConstraints();
jl_val1.setFont(valueFont);
gBC_v1.weightx = 0.5;
gBC_v1.weighty = 0.4;
gBC_v1.gridx = 0;
gBC_v1.gridy = 1;
gBC_v1.anchor = GridBagConstraints.LINE_END;
gBC_v1.fill = GridBagConstraints.BOTH;     
mainPanel.add(jl_val1, gBC_v1);
(...) The mainPanel is the panel with the Gridbaglayout.
by resizing the widget i call this method:
public void adjustFontSize(JLabel label){
                int adjustedFontSize;
     int inset = 2; // space surrounding the label
     int parentHeight = label.getHeight();     
     int parentWidth = label.getWidth();
//     System.out.println("available space for  "+label.getText()+": "+ parentWidth +"*"+ parentHeight);     
     if (parentHeight <= parentWidth){
          adjustedFontSize = parentHeight - inset;
     } else {
          adjustedFontSize = parentWidth - inset;
     label.setFont(new Font(null, Font.BOLD, adjustedFontSize));
     System.out.println("adjusting font size for "+label.getText()+": "+adjustedFontSize);
}//end adjustFontSizethe problem is, that the resizing doesn't really work.
any ideas?
the best thing would be to get the parent cell size of the label to resize, and set the font size to allmost this value
, but i am not able to get the cell size to adjust the label or font size:
thanks for your help
Edited by: Sniezn on Mar 12, 2010 1:05 AM

To make this function properly, you may need to create your own layout manager or do something even more hackish.Here's something more hackish. But first, setting GBC anchor with fill=BOTH doesn't have any effect as the component is resized to fill its cell, so might as well be anchored at all the four corners. Also, there's no need to create a new GBC instance for adding each component.
Is this the layout you were looking for?import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import javax.swing.*;
public class ZoomLabelTest {
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new ZoomLabelTest().makeUI();
  public void makeUI() {
    JLabel labelTitle = new ZoomLabel("title text");
    labelTitle.setHorizontalAlignment(JLabel.CENTER);
    JLabel labelVal1 = new ZoomLabel("val1");
    labelVal1.setHorizontalAlignment(JLabel.RIGHT);
    JLabel labelVal2 = new ZoomLabel("val2");
    JLabel labelVal3 = new ZoomLabel("val3");
    labelVal3.setHorizontalAlignment(JLabel.RIGHT);
    JLabel labelVal4 = new ZoomLabel("val4");
    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridwidth = 2;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.weightx = 1;
    gbc.weighty = 0.2;
    panel.add(labelTitle, gbc);
    gbc.gridwidth = 1;
    gbc.weightx = 0.5;
    gbc.weighty = 0.4;
    gbc.gridy = 1;
    panel.add(labelVal1, gbc);
    gbc.gridx = 1;
    panel.add(labelVal2, gbc);
    gbc.gridx = 0;
    gbc.gridy = 2;
    panel.add(labelVal3, gbc);
    gbc.gridx = 1;
    panel.add(labelVal4, gbc);
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);
    frame.setContentPane(panel);
    frame.setVisible(true);
class ZoomLabel extends JLabel {
  ComponentListener listener = new ZoomListener();
  public ZoomLabel(String text) {
    super(text);
    addComponentListener(listener);
  private class ZoomListener extends ComponentAdapter {
    @Override
    public void componentResized(ComponentEvent e) {
      // doesn't make a difference for GBL but does for some
      // other layouts, notably BorderLayout
      setPreferredSize(getSize());
      Insets insets = getInsets();
      Font font = getFont();
      int width = getWidth() - insets.left - insets.right;
      int height = getHeight() - insets.top - insets.bottom;
      boolean increased = false;
      boolean decreased = false;
      do {
        Rectangle2D textRect = font.getStringBounds(getText(),
                new FontRenderContext(null, true, false));
        int textWidth = (int) textRect.getWidth();
        int textHeight = (int) textRect.getHeight();
        if (textWidth > width || textHeight > height) {
          font = font.deriveFont((float) font.getSize() - 1);
          if (increased) {
            break;
          decreased = true;
        } else {
          if (decreased) {
            break;
          font = font.deriveFont((float) font.getSize() + 1);
          increased = true;
      } while (true);
      setFont(font);
}db
PS Now somebody tell me that it's not a good idea to setPreferredSize in componentResized ... along with an alternative that's clean(er) ;-)
edit No, that needs a lot more work to be stable with GBL (or maybe it never will be). It appears to be stable only with the same weightx / weighty for all columns/rows.
Edited by: DarrylBurke

Similar Messages

  • How to get the size of driver[C: or D:]

    Hi Friends,
    I have a query regarding to java..
    I want to get the name of all the drives that r connected to the System including network drives...
    and how to get the size of any system drive[For example C: or D: Drive].
    I want the output to be displayed like in the following format
    Device type size free Usage_Space
    for ex.
    C: NTFS 37.5Gb 30.5gb 7gb
    Output like as linux command df -h
    Edited by: KituPrash on Mar 4, 2009 3:29 AM

    Does this help for starters?
    File[] roots= File.listRoots();
    for (int i= 0; i< roots.length; i++)
         System.out.println(roots[i]+": "+roots.getTotalSpace());kind regards,
    Jos                                                                                                                                                                                                                                                                                                                                                                                                   

  • How to get the size of physical memory by using system call ?

    how to get the size of physical memory by using system call ?What system call can be used for me to get the size of physical memor? thanks.

    %vmstat 3
    procs memory page disk faults cpu
    r b w swap free re mf pi po fr de sr s0 -- -- -- in sy cs us sy id
    0 0 0 3025816 994456 4 19 6 0 0 0 0 8 0 0 0 459 253 139 1 1 99
    0 0 0 2864688 777408 0 2 0 0 0 0 0 3 0 0 0 428 134 175 0 1 99
    0 0 0 2864688 777408 0 0 0 0 0 0 0 7 0 0 0 448 112 166 0 0 100
    one interesting observation about vmstat I found out is (mostly on Solaris)
    the first line of information always off chart, so I usually do a few interval to get constant result.
    if you use linux
    just
    cat /proc/meminfo

  • How to get the size of partition?

    The following SQL will get the rows of the fact table & aggregation. But how to get the size (MB) of the partition. select * from $system.discover_partition_stat That should be doable, because in BIDS, we can see the size of a partition, but from which
    view we can do that?

    This is the best bet you have SELECT * FROM SystemRestrictSchema($system.discover_partition_stat ,DATABASE_NAME = 'Adventure Works DW' ,CUBE_NAME = 'Adventure Works' ,MEASURE_GROUP_NAME = 'Internet Sales' ,PARTITION_NAME = 'Internet_Sales_2003') Refer
    this article: http://geekswithblogs.net/darrengosbell/archive/2008/12/02/ssas-are-my-aggregations-processed.aspxvinu

  • How to get the size of the webpage?

    I am designing a program to
    analyse the webpage content.
    wondering how to get the size of
    the webpage including its image's
    size and etc. Thanks in advance.

    As i know , the getContentLength just return
    then number of characters of its HTML code.
    By knowing the length of the HTML code, is
    not possible for me to calculate its download
    time... i wonder is there any way to get the
    total size of the page including its image size,
    applet size, and etc... Thanks : )

  • How to get the size of a hard disk?

    Hi,
    As above, how to get the size of a hard disk by using Java.
    Thanks you!
    Alex

    I would be interested in the answer of this question, too.
    In core Java there is no way to find it out in a platform independent manner because of the hardware abstraction of the VM. So my only idea is to write a native library for doing this and colling it via JNI

  • How to get the size of the table

    Hi All,
    How to get the size of the table in Oracle 10g?
    Is there any script which needs to be run?
    Regards,
    Apoorv

    Hi All,
    Sorry but somehow the table user_segments is not populated in my case. But we have another table SYS.ALL_TABLES whose structure is given below. Would I be able to calculate the table size based on the columns given below:
    ColumnName     Data Type
    OWNER     VARCHAR2 (30 Byte)
    TABLE_NAME     VARCHAR2 (30 Byte)
    TABLESPACE_NAME     VARCHAR2 (30 Byte)
    CLUSTER_NAME     VARCHAR2 (30 Byte)
    IOT_NAME     VARCHAR2 (30 Byte)
    STATUS     VARCHAR2 (8 Byte)
    PCT_FREE     NUMBER
    PCT_USED     NUMBER
    INI_TRANS     NUMBER
    MAX_TRANS     NUMBER
    INITIAL_EXTENT     NUMBER
    NEXT_EXTENT     NUMBER
    MIN_EXTENTS     NUMBER
    MAX_EXTENTS     NUMBER
    PCT_INCREASE     NUMBER
    FREELISTS     NUMBER
    FREELIST_GROUPS     NUMBER
    LOGGING     VARCHAR2 (3 Byte)
    BACKED_UP     VARCHAR2 (1 Byte)
    NUM_ROWS     NUMBER
    BLOCKS     NUMBER
    EMPTY_BLOCKS     NUMBER
    AVG_SPACE     NUMBER
    CHAIN_CNT     NUMBER
    AVG_ROW_LEN     NUMBER
    AVG_SPACE_FREELIST_BLOCKS     NUMBER
    NUM_FREELIST_BLOCKS     NUMBER
    DEGREE     VARCHAR2 (10 Byte)
    INSTANCES     VARCHAR2 (10 Byte)
    CACHE     VARCHAR2 (5 Byte)
    TABLE_LOCK     VARCHAR2 (8 Byte)
    SAMPLE_SIZE     NUMBER
    LAST_ANALYZED     DATE
    PARTITIONED     VARCHAR2 (3 Byte)
    IOT_TYPE     VARCHAR2 (12 Byte)
    TEMPORARY     VARCHAR2 (1 Byte)
    SECONDARY     VARCHAR2 (1 Byte)
    NESTED     VARCHAR2 (3 Byte)
    BUFFER_POOL     VARCHAR2 (7 Byte)
    ROW_MOVEMENT     VARCHAR2 (8 Byte)
    GLOBAL_STATS     VARCHAR2 (3 Byte)
    USER_STATS     VARCHAR2 (3 Byte)
    DURATION     VARCHAR2 (15 Byte)
    SKIP_CORRUPT     VARCHAR2 (8 Byte)
    MONITORING     VARCHAR2 (3 Byte)
    CLUSTER_OWNER     VARCHAR2 (30 Byte)
    DEPENDENCIES     VARCHAR2 (8 Byte)
    COMPRESSION     VARCHAR2 (8 Byte)
    DROPPED     VARCHAR2 (3 Byte)

  • How to get the size of the cuurrent illustration

    Sorry, I made a mistake before this one. The questios is this: can anybody tell me how can I get the size of the current illustration, (as oposed to the page size) in points. Something like 120 points wide and 87 points High?. What function do I need to call?

    From AI Function reference (included with CS2 SDK):
    AIDocumentSetup setup;
    error = sDocument->GetDocumentSetup(&setup);
    if (error) goto processError;
    writeDocumentSetup( &setup );
    The AIDocumentSetup record returns the following information:
    typedef struct {
    AIReal width, height;
    AIBoolean showPlacedImages;
    short pageView;
    AIReal outputResolution;
    AIBoolean splitLongPaths;
    AIBoolean useDefaultScreen;
    AIBoolean compatibleGradients;
    AIBoolean printTiles;
    AIBoolean tileFullPages;
    } AIDocumentSetup;

  • How to get the size of a file DONE

    How can I get the size a file? I want to do the following....
    File clobDataFile = new File("clob.dat");
    PrintWriter clobpw = new PrintWriter(new BufferedWriter(new FileWriter(clobDataFile)));
    int               offset     = //get the number of chars in the fileOk I am a tard... figured it out...
    File clobDataFile = new File("clob.dat");
    PrintWriter clobpw = new PrintWriter(new BufferedWriter(new FileWriter(clobDataFile)));
    int               offset     =colbDataFile.length();

    read API http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#length()
    next time you have a similar question please refer this document

  • How to get the size of the file

    Hi All,
    I want to get the size of the file in terms of bytes. I used the following code it returns the value in long how can get it in bytes
    import java.io.File;
    public class ServerBackupCheck {
         public static void main(String args[]){
              File f = new File("C:/Program Files/Apache Software Foundation/Tomcat 5.5");
              System.out.println(f.isDirectory());
              System.out.println(f.getTotalSpace());
    output:
    true
    20964163584
    regards,
    Maheshwaran Devaraj

    if it is a folder you can use this recursive algorithm
    public static long recurse(File f) throws IOException
              long bytes = 0;
              File files[] = f.listFiles();
              for(int i =0 ;i<files.length;i++)
                   File file = files ;
                   if(file.isFile())
                        FileInputStream fis = new FileInputStream(file);
                        byte[] by = new byte[fis.available()];
                        fis.read(by);
                        bytes = bytes + by.length;
                   if(file.isDirectory())
                        bytes = bytes + recurse(file);
              return bytes;
    System.out.println(recurse(f));  gives you the total bytes....
    Ayberk Cansever ..                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

  • How to get the size of file

    Hi
    I want to know the size of the file from Java. ie If i have 10 lines in that file each of 15 characters
    then 10 *2*10=200Bytes is the size. How will i get this?
    More over, if i am reading the 4 the line, how will get the info that I have read 3 lines =3*2*10= 60 bytes so far?
    Regards
    Sriram

    This is from the JavaDocs on java.io.File
    length
    public long length()
    Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory.
    Returns:
    The length, in bytes, of the file denoted by this abstract pathname, or 0L if the file does not exist
    Any of the read methods (except readLine()) on the many stream objects return the number of bytes read, simply accumulate these returns to know how many bytes have been read.
    Dave

  • How to get the size of JSP html output?

    Hi,
    Is there a JSP method to get the size of JSP HTML output.
    e.g. I would like to print the size of the JSP e.g.
    Size of this page is <%=pageContext.getPageSize()%> Kb ???
    Any ideas? Thanks.
    George
    Edited by: googchro on Jan 5, 2010 4:45 PM

    Would you like to print "the size of this page is..." before or after you calculate the size of the page.
    Because adding that bit of text to the page will make the page bigger...
    Doing it in java, the best approach would probably to have a filter counting the number of bytes that gets sent to the writer/output stream.
    A client side tool measuring the amount of bytes received would probably be easier though.
    You can always look at the Content-length header sent with a response. Though you normally don't have access to that on the java/jsp side, as it is sent by the container.
    cheers,
    evnafets

  • How to get the size of the test put in a JPasswordField ?

    I've checked all the methods that may allow me to know the size
    of the text in a JPasswordField.
    I tested getCaretPosition() , getSelectedEnd()
    and they don't satisfy me : they give the current position of the cursor
    and not the size of the text typed. The only safe method is the use
    of the method getText() which is deprecated, so that i can get the
    size of the resulting String.
    Is there a method that allow to know the size of a char arrays ?
    Any help will be welcome, thanks.

    JPasswordFieldObj.getPassword().length;the length variable isn't visible in the forte visual parameters.
    thanks a lot, it saved me a lot of time and let me keep the
    getPassword() secure.
    Sorry, don't have more duke dollars, but you should have get some for this.

  • How to get the size of the blob file uploaded ?

    Hi ,
    Is there anyway to get the size of the file i have uploaded to a blob type attribute ?
    What i can see is that when we upload a file in contributor UI ,once the file is uploaded successfully and if we hover on it , it will show the filename , type and size of the uploaded file .
    From where can we get that details so that we can reuse these details in our code ?
    Thanks and Regards,
    Praveen

    A filter is a sensible solution, or you can get it in a roundabout way like this for example if you have the blobid (this is paraphrased from OpenMarket/Gator/AttributeTypes/IMAGEPICKERShowImages.jsp):
    <ics:sql sql='<%="select urldata,filevalue from MungoBlobs where id=" + ics.GetVar("blobid")%>' listname="blobdata" table="MungoBlobs" />
    <ics:listget listname="blobdata" fieldname="urldata" output="urldata" />
    <ics:setvar name="blobpath" value='<%=ics.GetProperty("cc.urlattrpath", "gator.ini", true) + ics.GetVar("urldata")%>' />
    <%
    File blobFile = new File(ics.GetVar("blobpath"));
    long length = blobFile.length();
    %>
    Phil
    Message was edited by: pgleghorn

  • How to get the position of a selected cell in a table ?

    Hi,
    How can I get the position of a selected cell in a table or in a list multicolumn cmd ?
    Thanks.

    Invoke node >>> point to Row Column
    Ben
    Message Edited by Ben on 07-19-2007 03:14 PM
    Ben Rayner
    I am currently active on.. MainStream Preppers
    Rayner's Ridge is under construction
    Attachments:
    Point_To_Row_Column.PNG ‏22 KB

Maybe you are looking for