Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #9900 > unrolled thread

How to align swing buttons vertically ?

Started byOlivier Scalbert <olivier.scalbert@algosyn.com>
First post2011-11-13 11:30 +0100
Last post2011-11-13 09:27 -0800
Articles 14 — 6 participants

Back to article view | Back to comp.lang.java.programmer


Contents

  How to align swing buttons vertically ? Olivier Scalbert <olivier.scalbert@algosyn.com> - 2011-11-13 11:30 +0100
    Re: How to align swing buttons vertically ? Martin Gregorie <martin@address-in-sig.invalid> - 2011-11-13 12:50 +0000
      Re: How to align swing buttons vertically ? Olivier Scalbert <olivier.scalbert@algosyn.com> - 2011-11-13 14:21 +0100
        Re: How to align swing buttons vertically ? Martin Gregorie <martin@address-in-sig.invalid> - 2011-11-13 14:38 +0000
          Re: How to align swing buttons vertically ? Olivier Scalbert <olivier.scalbert@algosyn.com> - 2011-11-13 18:28 +0100
            Re: How to align swing buttons vertically ? Knute Johnson <nospam@knutejohnson.com> - 2011-11-13 11:01 -0800
              Re: How to align swing buttons vertically ? Olivier Scalbert <olivier.scalbert@algosyn.com> - 2011-11-13 21:17 +0100
                Re: How to align swing buttons vertically ? Knute Johnson <nospam@knutejohnson.com> - 2011-11-13 16:16 -0800
            Re: How to align swing buttons vertically ? Martin Gregorie <martin@address-in-sig.invalid> - 2011-11-13 19:17 +0000
              Re: How to align swing buttons vertically ? Olivier Scalbert <olivier.scalbert@algosyn.com> - 2011-11-13 21:01 +0100
                Re: How to align swing buttons vertically ? "John B. Matthews" <nospam@nospam.invalid> - 2011-11-13 17:33 -0500
            Re: How to align swing buttons vertically ? Lew <lewbloch@gmail.com> - 2011-11-13 11:03 -0800
              Re: How to align swing buttons vertically ? Knute Johnson <nospam@knutejohnson.com> - 2011-11-13 16:28 -0800
    Re: How to align swing buttons vertically ? Roedy Green <see_website@mindprod.com.invalid> - 2011-11-13 09:27 -0800

#9900 — How to align swing buttons vertically ?

FromOlivier Scalbert <olivier.scalbert@algosyn.com>
Date2011-11-13 11:30 +0100
SubjectHow to align swing buttons vertically ?
Message-ID<4ebf9c51$0$5055$ba620e4c@news.skynet.be>
Hello !

I want to create a swing application with a main frame and a panel
containing vertically aligned buttons at the right side. Here is the code:

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

public class TestViewer {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ViewerFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(800, 600);
                frame.setVisible(true);
            }
        });
    }
}

class ViewerFrame extends JFrame {

    public ViewerFrame() {
        getContentPane().add(new JPanel(), BorderLayout.CENTER);
        getContentPane().add(createBtnPanel(), BorderLayout.EAST);
    }

    private JPanel createBtnPanel() {
        JPanel btnPanel = new JPanel();

        btnPanel.setLayout(new GridLayout(0, 1));

        btnPanel.add(new JButton("Button 1"));
        btnPanel.add(new JButton("Button 2"));
        btnPanel.add(new JButton("Long Button 3"));
        btnPanel.add(new JButton("Button 4"));
        btnPanel.add(new JButton("Button 5"));

        // Trick here !
        // I put the btnPanel at the NORTH of a "dummy" panel to have
        // the correct button sizes !!!
        // Other solutions ??
        JPanel dummyPanel = new JPanel();
        dummyPanel.setLayout(new BorderLayout());
        dummyPanel.add(btnPanel, BorderLayout.NORTH);

        return dummyPanel;
    }
}

It works, but is there an other way to avoid the dummyPanel trick ?

Thanks a lot !

Olivier

[toc] | [next] | [standalone]


#9904

FromMartin Gregorie <martin@address-in-sig.invalid>
Date2011-11-13 12:50 +0000
Message-ID<j9oef0$ti8$2@localhost.localdomain>
In reply to#9900
On Sun, 13 Nov 2011 11:30:40 +0100, Olivier Scalbert wrote:

> It works, but is there an other way to avoid the dummyPanel trick ?
>
Use a BoxLayout specifying the axis as Y-AXIS.
 

-- 
martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

[toc] | [prev] | [next] | [standalone]


#9907

FromOlivier Scalbert <olivier.scalbert@algosyn.com>
Date2011-11-13 14:21 +0100
Message-ID<4ebfc473$0$5044$ba620e4c@news.skynet.be>
In reply to#9904
On 11/13/2011 01:50 PM, Martin Gregorie wrote:
> Use a BoxLayout specifying the axis as Y-AXIS.
>  
> 
Thanks !
But with the BoxLayout they are aligned but they have not the same size!

[toc] | [prev] | [next] | [standalone]


#9908

FromMartin Gregorie <martin@address-in-sig.invalid>
Date2011-11-13 14:38 +0000
Message-ID<j9okpi$va3$1@localhost.localdomain>
In reply to#9907
On Sun, 13 Nov 2011 14:21:55 +0100, Olivier Scalbert wrote:

> On 11/13/2011 01:50 PM, Martin Gregorie wrote:
>> Use a BoxLayout specifying the axis as Y-AXIS.
>>  
>>  
> Thanks !
> But with the BoxLayout they are aligned but they have not the same size!
>
That's nothing to do with the layout. It aligns the objects you're laying 
out by doing its best with the sizes of the objects you created.

JButton inherits size setting methods (setMaximumSize, setMinimumSize, 
setPreferredSize) from JComponent. Use them to control button size.



-- 
martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

[toc] | [prev] | [next] | [standalone]


#9923

FromOlivier Scalbert <olivier.scalbert@algosyn.com>
Date2011-11-13 18:28 +0100
Message-ID<4ebffe4c$0$5045$ba620e4c@news.skynet.be>
In reply to#9908
On 11/13/2011 03:38 PM, Martin Gregorie wrote:
> That's nothing to do with the layout. It aligns the objects you're laying 
> out by doing its best with the sizes of the objects you created.
> 
> JButton inherits size setting methods (setMaximumSize, setMinimumSize, 
> setPreferredSize) from JComponent. Use them to control button size.
> 
> 
> 

Perhaps I have not understand, but with the following code, buttons are
not well aligned:

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

public class TestViewer {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ViewerFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(800, 600);
                frame.setVisible(true);
            }
        });
    }
}

class ViewerFrame extends JFrame {

    public ViewerFrame() {
        getContentPane().add(new JPanel(), BorderLayout.CENTER);
        getContentPane().add(createBtnPanel(), BorderLayout.EAST);
    }

    private JPanel createBtnPanel() {
        JPanel btnPanel = new JPanel();

        btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));

        btnPanel.add(new JButton("Button 1"));
        btnPanel.add(new JButton("Button 2"));
        btnPanel.add(new JButton("Long Button 3"));
        btnPanel.add(new JButton("Button 4"));
        btnPanel.add(new JButton("Button 5"));

        return btnPanel;
    }
}

Olivier

[toc] | [prev] | [next] | [standalone]


#9927

FromKnute Johnson <nospam@knutejohnson.com>
Date2011-11-13 11:01 -0800
Message-ID<j9p461$eqc$1@dont-email.me>
In reply to#9923
On 11/13/2011 9:28 AM, Olivier Scalbert wrote:
> On 11/13/2011 03:38 PM, Martin Gregorie wrote:
>> That's nothing to do with the layout. It aligns the objects you're laying
>> out by doing its best with the sizes of the objects you created.
>>
>> JButton inherits size setting methods (setMaximumSize, setMinimumSize,
>> setPreferredSize) from JComponent. Use them to control button size.
>>
>>
>>
>
> Perhaps I have not understand, but with the following code, buttons are
> not well aligned:
>
> import java.awt.*;
> import javax.swing.*;
>
> public class TestViewer {
>
>      public static void main(String[] args) {
>          EventQueue.invokeLater(new Runnable() {
>              public void run() {
>                  JFrame frame = new ViewerFrame();
>                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>                  frame.setSize(800, 600);
>                  frame.setVisible(true);
>              }
>          });
>      }
> }
>
> class ViewerFrame extends JFrame {
>
>      public ViewerFrame() {
>          getContentPane().add(new JPanel(), BorderLayout.CENTER);
>          getContentPane().add(createBtnPanel(), BorderLayout.EAST);
>      }
>
>      private JPanel createBtnPanel() {
>          JPanel btnPanel = new JPanel();
>
>          btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
>
>          btnPanel.add(new JButton("Button 1"));
>          btnPanel.add(new JButton("Button 2"));
>          btnPanel.add(new JButton("Long Button 3"));
>          btnPanel.add(new JButton("Button 4"));
>          btnPanel.add(new JButton("Button 5"));
>
>          return btnPanel;
>      }
> }
>
> Olivier

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

public class test extends JPanel {
     public test() {
         super(new GridBagLayout());

         GridBagConstraints c = new GridBagConstraints();
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridy = 0;

         String labels[] = {"Button 1","Button 2",
          "Long Button 3","Button 4","Button 5"};

         for (int i=0; i<labels.length; i++) {
             add(new JButton(labels[i]),c);
             ++c.gridy;
         }
     }

     public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             public void run() {
                 JFrame f = new JFrame();
                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 f.add(new test(),BorderLayout.EAST);
                 f.setSize(700,500);
                 f.setVisible(true);
             }
         });
     }
}

-- 

Knute Johnson

[toc] | [prev] | [next] | [standalone]


#9933

FromOlivier Scalbert <olivier.scalbert@algosyn.com>
Date2011-11-13 21:17 +0100
Message-ID<4ec025cd$0$5046$ba620e4c@news.skynet.be>
In reply to#9927
On 11/13/2011 08:01 PM, Knute Johnson wrote:
> 
> import java.awt.*;
> import java.awt.event.*;
> import javax.swing.*;
> 
> public class test extends JPanel {
>     public test() {
>         super(new GridBagLayout());
> 
>         GridBagConstraints c = new GridBagConstraints();
>         c.fill = GridBagConstraints.HORIZONTAL;
>         c.gridy = 0;
> 
>         String labels[] = {"Button 1","Button 2",
>          "Long Button 3","Button 4","Button 5"};
> 
>         for (int i=0; i<labels.length; i++) {
>             add(new JButton(labels[i]),c);
>             ++c.gridy;
>         }
>     }
> 
>     public static void main(String[] args) {
>         EventQueue.invokeLater(new Runnable() {
>             public void run() {
>                 JFrame f = new JFrame();
>                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>                 f.add(new test(),BorderLayout.EAST);
>                 f.setSize(700,500);
>                 f.setVisible(true);
>             }
>         });
>     }
> }
> 
Ok, all the buttons have the same size and are aligned ! When I resize
the main frame, the group of buttons is in the EAST part but in the
middle of the frame height. Is it possible the have this group on top
(of the EAST part) ?

[toc] | [prev] | [next] | [standalone]


#9943

FromKnute Johnson <nospam@knutejohnson.com>
Date2011-11-13 16:16 -0800
Message-ID<j9pmkf$dq7$1@dont-email.me>
In reply to#9933
On 11/13/2011 12:17 PM, Olivier Scalbert wrote:
> On 11/13/2011 08:01 PM, Knute Johnson wrote:
>>
>> import java.awt.*;
>> import java.awt.event.*;
>> import javax.swing.*;
>>
>> public class test extends JPanel {
>>      public test() {
>>          super(new GridBagLayout());
>>
>>          GridBagConstraints c = new GridBagConstraints();
>>          c.fill = GridBagConstraints.HORIZONTAL;
>>          c.gridy = 0;
>>
>>          String labels[] = {"Button 1","Button 2",
>>           "Long Button 3","Button 4","Button 5"};
>>
>>          for (int i=0; i<labels.length; i++) {

             if (i == labels.length - 1) {  // last label
                 // anchor last button to north and give it
                 // a weighty of 1.0.  this will tell that
                 // button to take all remaining vertical
                 // space and will push all the other
                 // buttons to top of the container
                 c.anchor = GridBagConstraints.NORTH;
                 c.weighty = 1.0
             }

>>              add(new JButton(labels[i]),c);
>>              ++c.gridy;
>>          }
>>      }
>>
>>      public static void main(String[] args) {
>>          EventQueue.invokeLater(new Runnable() {
>>              public void run() {
>>                  JFrame f = new JFrame();
>>                  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>>                  f.add(new test(),BorderLayout.EAST);
>>                  f.setSize(700,500);
>>                  f.setVisible(true);
>>              }
>>          });
>>      }
>> }
>>
> Ok, all the buttons have the same size and are aligned ! When I resize
> the main frame, the group of buttons is in the EAST part but in the
> middle of the frame height. Is it possible the have this group on top
> (of the EAST part) ?


-- 

Knute Johnson

[toc] | [prev] | [next] | [standalone]


#9929

FromMartin Gregorie <martin@address-in-sig.invalid>
Date2011-11-13 19:17 +0000
Message-ID<j9p54b$3bu$1@localhost.localdomain>
In reply to#9923
On Sun, 13 Nov 2011 18:28:44 +0100, Olivier Scalbert wrote:

> On 11/13/2011 03:38 PM, Martin Gregorie wrote:
>> That's nothing to do with the layout. It aligns the objects you're
>> laying out by doing its best with the sizes of the objects you created.
>> 
>> JButton inherits size setting methods (setMaximumSize, setMinimumSize,
>> setPreferredSize) from JComponent. Use them to control button size.
>> 
> Perhaps I have not understand, but with the following code, buttons are
> not well aligned:
> 
They aligned as I'd expect: 
- btnPanel is sized to contain the buttons and nothing else
  and is placed as you asked, on the east side of the content pane.
 
- The buttons have their centres aligned.

I don't understand what you mean by "not well aligned":

- If you want the buttons to appear as other than a close-packed block,
  take a look at "How to use BoxLayout" in the Java tutorial. It is also
  referenced from the the class description in the BoxLayout javadocs
  entry.

- If you want all buttons to be the same size, use a custom class in
  place of JButton:

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

class MyButton extends JButton 
{

   public MyButton(String label) 
{
      super(label);

      Dimension d = new Dimension(120, 30);      
      setMinimumSize(d);
      setMaximumSize(d);
      setPreferredSize(d);
   }   
}


-- 
martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

[toc] | [prev] | [next] | [standalone]


#9931

FromOlivier Scalbert <olivier.scalbert@algosyn.com>
Date2011-11-13 21:01 +0100
Message-ID<4ec02213$0$5039$ba620e4c@news.skynet.be>
In reply to#9929
On 11/13/2011 08:17 PM, Martin Gregorie wrote:

> They aligned as I'd expect: 
> - btnPanel is sized to contain the buttons and nothing else
>   and is placed as you asked, on the east side of the content pane.
>  
> - The buttons have their centres aligned.
> 
> I don't understand what you mean by "not well aligned":
> 
> - If you want the buttons to appear as other than a close-packed block,
>   take a look at "How to use BoxLayout" in the Java tutorial. It is also
>   referenced from the the class description in the BoxLayout javadocs
>   entry.
> 
> - If you want all buttons to be the same size, use a custom class in
>   place of JButton:
> 
> import java.awt.*;
> import javax.swing.*;
> 
> class MyButton extends JButton 
> {
> 
>    public MyButton(String label) 
> {
>       super(label);
> 
>       Dimension d = new Dimension(120, 30);      
>       setMinimumSize(d);
>       setMaximumSize(d);
>       setPreferredSize(d);
>    }   
> }
> 
> 

Hi,

With "my version", I have (at least on my machine):
-----------------
|   button 1    |
-----------------
|   button 2    |
-----------------
| Long Button 3 |
-----------------
|   button 4    |
-----------------
|   button 5    |
-----------------

With "yours" (at least the one I post with the BoxLayout):

------------
| button 1 |
------------
| button 2 |
-----------------
| Long Button 3 |
-----------------
| button 4 |
------------
| button 5 |
------------

[toc] | [prev] | [next] | [standalone]


#9942

From"John B. Matthews" <nospam@nospam.invalid>
Date2011-11-13 17:33 -0500
Message-ID<nospam-0D505D.17331213112011@news.aioe.org>
In reply to#9931
In article <4ec02213$0$5039$ba620e4c@news.skynet.be>,
 Olivier Scalbert <olivier.scalbert@algosyn.com> wrote:

> With "my version", I have (at least on my machine):
> -----------------
> |   button 1    |
> -----------------
> |   button 2    |
> -----------------
> | Long Button 3 |
> -----------------
> |   button 4    |
> -----------------
> |   button 5    |
> -----------------
> 
> With "yours" (at least the one I post with the BoxLayout):
> 
> ------------
> | button 1 |
> ------------
> | button 2 |
> -----------------
> | Long Button 3 |
> -----------------
> | button 4 |
> ------------
> | button 5 |
> ------------

Lew is correct about using pack(), and I'm with Martin on BoxLayout. 
One problem with using setXXXSize is that the values statically replace 
those computed by the component's Look & Feel. Instead override just 
the one needed by BoxLayout to make the buttons "as wide as their 
container."

<http://download.oracle.com/javase/tutorial/uiswing/layout/box.html>

As an aside, your center panel contains no components, so it would 
pack() to the L&F's minimum. I've given it an arbitrary size by 
overriding getPreferredSize(), but setPreferredSize() would do as well 
for the fixed value.

I defer to Knute on GridBagLayout.

Here's an <http://sscce.org/>:

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

public class TestViewer {
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                JFrame frame = new ViewerFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

class ViewerFrame extends JFrame {
    
    public ViewerFrame() {
        // a panel of aribtrary size
        this.add(new JPanel() {
            
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        }, BorderLayout.CENTER);
        this.add(createBtnPanel(), BorderLayout.EAST);
    }
    
    private JPanel createBtnPanel() {
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
        btnPanel.add(createButton("Button 1"));
        btnPanel.add(createButton("Button 2"));
        btnPanel.add(createButton("Long Button 3"));
        btnPanel.add(createButton("Button 4"));
        btnPanel.add(createButton("Button 5"));
        return btnPanel;
    }
    
    private JButton createButton(String name) {
        final JButton b = new JButton(name) {
            
            @Override
            public Dimension getMaximumSize() {
                return new Dimension(
                    Short.MAX_VALUE, getPreferredSize().height);
            }
        };
        b.setAlignmentX(0.5f);
        return b;
    }
}

-- 
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>

[toc] | [prev] | [next] | [standalone]


#9930

FromLew <lewbloch@gmail.com>
Date2011-11-13 11:03 -0800
Message-ID<2442894.209.1321211019540.JavaMail.geo-discussion-forums@prew38>
In reply to#9923
Olivier Scalbert wrote:
> Perhaps I have not understand, but with the following code, buttons are
> not well aligned:
> 
> import java.awt.*;
> import javax.swing.*;
> 
> public class TestViewer {
> 
>     public static void main(String[] args) {
>         EventQueue.invokeLater(new Runnable() {
>             public void run() {
>                 JFrame frame = new ViewerFrame();
>                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>                 frame.setSize(800, 600);

Shouldn't you call 'pack()' right here?  Layouts often don't work well without it.

>                 frame.setVisible(true);
>             }
>         });
>     }
> }
> 
> class ViewerFrame extends JFrame {
> 
>     public ViewerFrame() {
>         getContentPane().add(new JPanel(), BorderLayout.CENTER);
>         getContentPane().add(createBtnPanel(), BorderLayout.EAST);
>     }
> 
>     private JPanel createBtnPanel() {
>         JPanel btnPanel = new JPanel();
> 
>         btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
> 
>         btnPanel.add(new JButton("Button 1"));
>         btnPanel.add(new JButton("Button 2"));
>         btnPanel.add(new JButton("Long Button 3"));
>         btnPanel.add(new JButton("Button 4"));
>         btnPanel.add(new JButton("Button 5"));
> 
>         return btnPanel;
>     }
> }

-- 
Lew

[toc] | [prev] | [next] | [standalone]


#9944

FromKnute Johnson <nospam@knutejohnson.com>
Date2011-11-13 16:28 -0800
Message-ID<j9pnam$gr8$1@dont-email.me>
In reply to#9930
On 11/13/2011 11:03 AM, Lew wrote:
> Olivier Scalbert wrote:
>> Perhaps I have not understand, but with the following code, buttons are
>> not well aligned:
>>
>> import java.awt.*;
>> import javax.swing.*;
>>
>> public class TestViewer {
>>
>>      public static void main(String[] args) {
>>          EventQueue.invokeLater(new Runnable() {
>>              public void run() {
>>                  JFrame frame = new ViewerFrame();
>>                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>>                  frame.setSize(800, 600);
>
> Shouldn't you call 'pack()' right here?  Layouts often don't work well without it.

The OP created a pretty good SSCCE here and for that purpose pack() 
would not demonstrate what he wanted to show.  The only possible problem 
he would have with the LayoutManager is too little space to display his 
example.  Most of the time, having extra space in a frame isn't going to 
cause any display problems.  I think he can be forgiven for not packing 
this time (as I hope I can for my example :-).

-- 

Knute Johnson

[toc] | [prev] | [next] | [standalone]


#9921

FromRoedy Green <see_website@mindprod.com.invalid>
Date2011-11-13 09:27 -0800
Message-ID<gavvb7ds3e9m989l2mtvklf96v9624uars@4ax.com>
In reply to#9900
On Sun, 13 Nov 2011 11:30:40 +0100, Olivier Scalbert
<olivier.scalbert@algosyn.com> wrote, quoted or indirectly quoted
someone who said :

>I want to create a swing application with a main frame and a panel
>containing vertically aligned buttons at the right side. Here is the code:

How Components align is decided by the Layout Manager. It might take
clues from fields in the Components, or it may not.  Usually when you
start having trouble intimidating your LayoutManager into ever higher
levels of aesthetic perfection, it is time for a more advanced
LayoutManager, or cannibalising ideas from other users of your current
LayoutManager.  It is amazing how much source code you can find with
Google with some package, class or method names.


See http://mindprod.com/jgloss/layout.html
-- 
Roedy Green Canadian Mind Products
http://mindprod.com
I can't come to bed just yet. Somebody is wrong on the Internet. 

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web