0

I am kinda new to Swing and I was experimenting with how I can place components with a null Layout. Here is a program where the button b3(towards the end) goes half inside the panel pan1 and half is invisible.

I added a scrollpane to take pan1, and the scrollpane seems to be there, but it doesn't scroll. Is there a way to scroll so that I can view the full button?

I don't want to change the absolute positions(null layout) of the other components. I just want to scroll so that button b3 is fully in view.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Swing18
{
public static void main()
{


JFrame frame1 = new JFrame("TESTING");

frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setSize(1000,700);
frame1.setLocation(200,100);
frame1.setResizable(false);


frame1.setLayout(null);


JPanel pan1 = new JPanel();
pan1.setBackground(Color.green);
pan1.setBounds(0,0,900,600);
frame1.add(pan1);


pan1.setLayout(null);

JButton east = new JButton("East");
JButton west = new JButton("West");
JButton north = new JButton("North");
JButton south = new JButton("South");


Color cr1 = new Color(0,127,0);
Font ft1 =new Font("impact",Font.BOLD,25);



north.setForeground(Color.white);
north.setBackground(cr1);

south.setForeground(Color.white);
south.setBackground(cr1);

east.setForeground(Color.white);
east.setBackground(Color.blue);
east.setFont(ft1);
east.setToolTipText(" This is the EAST zone");

west.setForeground(Color.white);
west.setBackground(Color.blue);
west.setFont(ft1);
west.setToolTipText(" This is the WEST zone");




JLabel lb1 = new  JLabel(" Label 1 ");

JLabel lb2 = new  JLabel(" Label 2 ");
lb2.setOpaque(true);
lb2.setForeground(Color.white);
lb2.setBackground(Color.black);
lb2.setFont(ft1);




JTextField tf1 =new JTextField(" TextField1");
tf1.setForeground(Color.white);
tf1.setBackground(Color.black);
tf1.setFont(ft1);


JTextField tf2 =new JTextField("TextField 2");




JTextArea ta1= new JTextArea("Enter TA",5,30);
ta1.setForeground(Color.white);
ta1.setBackground(Color.black);
ta1.setFont(ft1);
ta1.setLineWrap(true);



JSlider sd1 = new JSlider(50,150);
sd1.setMajorTickSpacing(20);
sd1.setMinorTickSpacing(10);
sd1.setPaintTicks(true);//essential for visible ticks
sd1.setPaintLabels(true);//essential for visible numbers
sd1.setForeground(Color.white);
sd1.setBackground(Color.black);

JSlider sd2 = new JSlider(JSlider.VERTICAL,50,200,100);
sd2.setMajorTickSpacing(25);
sd2.setMinorTickSpacing(5);
sd2.setPaintTicks(true);
sd2.setPaintLabels(true);

JSlider sd3 = new JSlider(JSlider.HORIZONTAL,50,200,100);
sd3.setMajorTickSpacing(25);
sd3.setMinorTickSpacing(5);



String[] fruit = {"Apple","Banana"," Coconut"," Date","Jujube","Guava","Grapes","Mango","Orange","Water Melon","Very Long Named Fruit"};
JList lt1 = new JList(fruit);
lt1.setForeground(Color.white);
lt1.setBackground(Color.black);


String[] country = {"Armenia","Bangladesh","China","Denmark","Egypt","France","Germany","Holland","India","Japan","Kyrgystan"," Lithuania","Mexico","North Korea","Singapore","Uruguay","Vanuatu"/*,"Very Big Named Country"*/};
JComboBox cb1 = new JComboBox(country);
cb1.setForeground(Color.yellow);
cb1.setBackground(Color.red);
cb1.setFont(ft1);




ButtonGroup bg1= new ButtonGroup();

JRadioButton rb1 = new JRadioButton(" Rose  ");
rb1.setForeground(Color.cyan);
rb1.setBackground(cr1);
bg1.add(rb1);

JRadioButton rb2 = new JRadioButton(" Lily  ");
rb2.setForeground(Color.cyan);
rb2.setBackground(cr1);
bg1.add(rb2);

JRadioButton rb3 = new JRadioButton(" Tulip  ");
rb3.setForeground(Color.cyan);
rb3.setBackground(cr1);
bg1.add(rb3);

JRadioButton rb4 = new JRadioButton(" SunFlower  ");
rb4.setForeground(Color.cyan);
rb4.setBackground(cr1);
bg1.add(rb4);



JCheckBox ch1 = new JCheckBox(" See  ");
ch1.setForeground(Color.magenta);
ch1.setBackground(Color.cyan);
bg1.add(ch1);


JCheckBox ch2 = new JCheckBox(" Touch  ");
ch2.setForeground(Color.magenta);
ch2.setBackground(Color.cyan);
bg1.add(ch2);


JCheckBox ch3 = new JCheckBox(" Smell  ");
ch3.setForeground(Color.magenta);
ch3.setBackground(Color.cyan);
bg1.add(ch3);



east.setBounds(400,200,80,100);
pan1.add(east);

west.setBounds(20,200,80,100);
pan1.add(west);

north.setBounds(200,10,100,80);
pan1.add(north);

south.setBounds(200,510,100,80);
pan1.add(south);



lb1.setBounds(0,0,100,50);
pan1.add(lb1);
lb2.setBounds(0,80,100,50);
pan1.add(lb2);


tf1.setBounds(10,350,80,30);
pan1.add(tf1);
tf2.setBounds(10,500,80,30);
pan1.add(tf2);



ta1.setBounds(400,10,100,180);
pan1.add(ta1);

sd1.setBounds(140,120,200,50);
pan1.add(sd1);
sd2.setBounds(210,200,50,200);
pan1.add(sd2);
sd3.setBounds(140,410,200,50);
pan1.add(sd3);


lt1.setBounds(520,20,120,200);
pan1.add(lt1);

cb1.setBounds(520,310,180,50);
pan1.add(cb1);


JScrollPane sp1 = new JScrollPane(lt1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp1.setBounds(lt1.getX(),lt1.getY(),lt1.getWidth(),lt1.getHeight());
pan1.add(sp1);


JScrollPane sp2 = new JScrollPane(cb1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp2.setBounds(cb1.getX(),cb1.getY(),cb1.getWidth(),cb1.getHeight());
pan1.add(sp2);


JScrollPane sp3 = new JScrollPane(ta1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp3.setBounds(ta1.getX(),ta1.getY(),ta1.getWidth()+10,ta1.getHeight()+10);
pan1.add(sp3);



JScrollPane sp4 = new JScrollPane(sd3,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp4.setBounds(sd3.getX(),sd3.getY(),sd3.getWidth(),sd3.getHeight());
pan1.add(sp4);


JScrollPane sp5 = new JScrollPane(tf1,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp5.setBounds(tf1.getX(),tf1.getY(),tf1.getWidth()+20,tf1.getHeight()+20);//20,20 seems the ideal width and height to add
pan1.add(sp5);


//Now we try scrollpane on a panel

JScrollPane sp6 = new JScrollPane(pan1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
sp6.setBounds(pan1.getX(),pan1.getY(),pan1.getWidth()+20,pan1.getHeight()+20);
frame1.add(sp6);




JPanel pan2 = new JPanel();
pan2.setBackground(Color.red);
pan2.setBounds(680,10,120,250);
pan1.add(pan2);

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

pan2.add(rb1);
pan2.add(rb2);
pan2.add(rb3);
pan2.add(rb4);

pan2.add(ch1);
pan2.add(ch2);
pan2.add(ch3);






   **JButton b3 = new JButton("A Very Big Button");**
   b3.setBackground(Color.white);
   b3.setBounds(850,40,120,50);
   pan1.add(b3);




/*

*/
frame1.setVisible(true);

}
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
user3015246
  • 139
  • 1
  • 2
  • 9

2 Answers2

3

I just want to scroll so that button b3 is fully in view.

Scrolling doesn't work when you use a null layout. That is why you should NOT use a null layout.

Swing was designed to be used with layout managers. When you use a layout manager, then scrolling will work automatically.

camickr
  • 321,443
  • 19
  • 166
  • 288
  • Thanks for answering. But can I set absolute positions with any Layout Manager? I guess I can do with grid Layout by dividing. But that layout looks very inflexible. Can I use multiple cells for a placing a component in grid layout? – user3015246 Nov 21 '13 at 17:34
  • @user3015246, the point of using a layout manager is so you `don't` specify absolute positions. There is no need to specify an absolute position because it is not flexible. Each layout manager was designed for specific needs. You can mix and match layout managers to get your desired layout. You are not forced to use a single layout manager. – camickr Nov 21 '13 at 18:07
3

I don't want to change the absolute positions(null layout) of the other components.

I strongly urge you to get rid of this restriction. Do so and use proper layout managers in an intelligent way, and scrolling will be easy.

Otherwise if you absolutely must use null layouts (and I doubt you do), consider creating creating your own JPanel-derived class that implements a Scrollable interface, but that's going to be a lot more work and will often have more bugs.


Also as an aside, note that your main method above will not work as it is missing the String[] args parameter.

Edit 2: there's a lot more wrong with your code including adding components multiple times to containers, and other strange goings-ons. Have you gone through the Swing tutorials? If not, please check them out as they will help you to no end.


Edit 2
Also note that for a JScrollPane to "scroll" the component held as its viewport's view, here your JPanel, has to be larger than that view.

For instance, I could make your main JPanel "scrollable" by setting its preferred size larger than that of the JScrollPane (forgive me kleopatra). Note that there's a lot in your code that I would not recommend doing, and setting bounds and preferred sizes are two of them, but this is being posted to show that the preferred sizes matter. I've also gotten rid of the JFrame's null layout, and have packed the JFrame before displaying it:

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

public class Swing18 {
   private static final Dimension PAN1_DIM = new Dimension(1000, 800);
   private static final Dimension SP6_DIM = new Dimension(700, 500);

   // **** note that the main method needs parameters!! ****
   public static void main(String[] args) {

      JFrame frame1 = new JFrame("TESTING");

      frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      // frame1.setSize(1000, 700);
      // frame1.setLocation(200, 100);
      // frame1.setResizable(false);

      // frame1.setLayout(null);

      JPanel pan1 = new JPanel();
      pan1.setBackground(Color.green);
      // pan1.setBounds(0, 0, 900, 600);
      pan1.setPreferredSize(PAN1_DIM);
      // frame1.add(pan1);

      pan1.setLayout(null);

      JButton east = new JButton("East");
      JButton west = new JButton("West");
      JButton north = new JButton("North");
      JButton south = new JButton("South");

      Color cr1 = new Color(0, 127, 0);
      Font ft1 = new Font("impact", Font.BOLD, 25);

      north.setForeground(Color.white);
      north.setBackground(cr1);

      south.setForeground(Color.white);
      south.setBackground(cr1);

      east.setForeground(Color.white);
      east.setBackground(Color.blue);
      east.setFont(ft1);
      east.setToolTipText(" This is the EAST zone");

      west.setForeground(Color.white);
      west.setBackground(Color.blue);
      west.setFont(ft1);
      west.setToolTipText(" This is the WEST zone");

      JLabel lb1 = new JLabel(" Label 1 ");

      JLabel lb2 = new JLabel(" Label 2 ");
      lb2.setOpaque(true);
      lb2.setForeground(Color.white);
      lb2.setBackground(Color.black);
      lb2.setFont(ft1);

      JTextField tf1 = new JTextField(" TextField1");
      tf1.setForeground(Color.white);
      tf1.setBackground(Color.black);
      tf1.setFont(ft1);

      JTextField tf2 = new JTextField("TextField 2");

      JTextArea ta1 = new JTextArea("Enter TA", 5, 30);
      ta1.setForeground(Color.white);
      ta1.setBackground(Color.black);
      ta1.setFont(ft1);
      ta1.setLineWrap(true);

      JSlider sd1 = new JSlider(50, 150);
      sd1.setMajorTickSpacing(20);
      sd1.setMinorTickSpacing(10);
      sd1.setPaintTicks(true);// essential for visible ticks
      sd1.setPaintLabels(true);// essential for visible numbers
      sd1.setForeground(Color.white);
      sd1.setBackground(Color.black);

      JSlider sd2 = new JSlider(JSlider.VERTICAL, 50, 200, 100);
      sd2.setMajorTickSpacing(25);
      sd2.setMinorTickSpacing(5);
      sd2.setPaintTicks(true);
      sd2.setPaintLabels(true);

      JSlider sd3 = new JSlider(JSlider.HORIZONTAL, 50, 200, 100);
      sd3.setMajorTickSpacing(25);
      sd3.setMinorTickSpacing(5);

      String[] fruit = { "Apple", "Banana", " Coconut", " Date", "Jujube",
            "Guava", "Grapes", "Mango", "Orange", "Water Melon",
            "Very Long Named Fruit" };
      JList lt1 = new JList(fruit);
      lt1.setForeground(Color.white);
      lt1.setBackground(Color.black);

      String[] country = { "Armenia", "Bangladesh", "China", "Denmark",
            "Egypt", "France", "Germany", "Holland", "India", "Japan",
            "Kyrgystan", " Lithuania", "Mexico", "North Korea", "Singapore",
            "Uruguay", "Vanuatu"/* ,"Very Big Named Country" */};
      JComboBox cb1 = new JComboBox(country);
      cb1.setForeground(Color.yellow);
      cb1.setBackground(Color.red);
      cb1.setFont(ft1);

      ButtonGroup bg1 = new ButtonGroup();

      JRadioButton rb1 = new JRadioButton(" Rose  ");
      rb1.setForeground(Color.cyan);
      rb1.setBackground(cr1);
      bg1.add(rb1);

      JRadioButton rb2 = new JRadioButton(" Lily  ");
      rb2.setForeground(Color.cyan);
      rb2.setBackground(cr1);
      bg1.add(rb2);

      JRadioButton rb3 = new JRadioButton(" Tulip  ");
      rb3.setForeground(Color.cyan);
      rb3.setBackground(cr1);
      bg1.add(rb3);

      JRadioButton rb4 = new JRadioButton(" SunFlower  ");
      rb4.setForeground(Color.cyan);
      rb4.setBackground(cr1);
      bg1.add(rb4);

      JCheckBox ch1 = new JCheckBox(" See  ");
      ch1.setForeground(Color.magenta);
      ch1.setBackground(Color.cyan);
      bg1.add(ch1);

      JCheckBox ch2 = new JCheckBox(" Touch  ");
      ch2.setForeground(Color.magenta);
      ch2.setBackground(Color.cyan);
      bg1.add(ch2);

      JCheckBox ch3 = new JCheckBox(" Smell  ");
      ch3.setForeground(Color.magenta);
      ch3.setBackground(Color.cyan);
      bg1.add(ch3);

      east.setBounds(400, 200, 80, 100);
      pan1.add(east);

      west.setBounds(20, 200, 80, 100);
      pan1.add(west);

      north.setBounds(200, 10, 100, 80);
      pan1.add(north);

      south.setBounds(200, 510, 100, 80);
      pan1.add(south);

      lb1.setBounds(0, 0, 100, 50);
      pan1.add(lb1);
      lb2.setBounds(0, 80, 100, 50);
      pan1.add(lb2);

      tf1.setBounds(10, 350, 80, 30);
      pan1.add(tf1);
      tf2.setBounds(10, 500, 80, 30);
      pan1.add(tf2);

      ta1.setBounds(400, 10, 100, 180);
      pan1.add(ta1);

      sd1.setBounds(140, 120, 200, 50);
      pan1.add(sd1);
      sd2.setBounds(210, 200, 50, 200);
      pan1.add(sd2);
      sd3.setBounds(140, 410, 200, 50);
      pan1.add(sd3);

      lt1.setBounds(520, 20, 120, 200);
      pan1.add(lt1);

      cb1.setBounds(520, 310, 180, 50);
      pan1.add(cb1);

      JScrollPane sp1 = new JScrollPane(lt1,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      sp1.setBounds(lt1.getX(), lt1.getY(), lt1.getWidth(), lt1.getHeight());
      pan1.add(sp1);

      JScrollPane sp2 = new JScrollPane(cb1,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      sp2.setBounds(cb1.getX(), cb1.getY(), cb1.getWidth(), cb1.getHeight());
      pan1.add(sp2);

      JScrollPane sp3 = new JScrollPane(ta1,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      sp3.setBounds(ta1.getX(), ta1.getY(), ta1.getWidth() + 10,
            ta1.getHeight() + 10);
      pan1.add(sp3);

      JScrollPane sp4 = new JScrollPane(sd3,
            JScrollPane.VERTICAL_SCROLLBAR_NEVER,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      sp4.setBounds(sd3.getX(), sd3.getY(), sd3.getWidth(), sd3.getHeight());
      pan1.add(sp4);

      JScrollPane sp5 = new JScrollPane(tf1,
            JScrollPane.VERTICAL_SCROLLBAR_NEVER,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      sp5.setBounds(tf1.getX(), tf1.getY(), tf1.getWidth() + 20,
            tf1.getHeight() + 20);// 20,20 seems the ideal width and height to
                                  // add
      pan1.add(sp5);

      // Now we try scrollpane on a panel

      JScrollPane sp6 = new JScrollPane(pan1,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      // sp6.setBounds(pan1.getX(), pan1.getY(), pan1.getWidth() + 20,
      // pan1.getHeight() + 20);

      sp6.setPreferredSize(SP6_DIM);
      frame1.add(sp6);

      JPanel pan2 = new JPanel();
      pan2.setBackground(Color.red);
      pan2.setBounds(680, 10, 120, 250);
      pan1.add(pan2);

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

      pan2.add(rb1);
      pan2.add(rb2);
      pan2.add(rb3);
      pan2.add(rb4);

      pan2.add(ch1);
      pan2.add(ch2);
      pan2.add(ch3);

      JButton b3 = new JButton("A Very Big Button"); // !!
      b3.setBackground(Color.white);
      b3.setBounds(850, 40, 120, 50);
      pan1.add(b3);

      frame1.pack();
      frame1.setLocationRelativeTo(null);
      frame1.setVisible(true);

   }
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • Thanks for answering. Actually, I deliberately used the null layout because I wanted to experiment a bit with it. I was hoping that there would be some easy way out. – user3015246 Nov 21 '13 at 17:30
  • @user3015246: your code is super weird to say the least. Please read the tutorials, as you will gain **much**. – Hovercraft Full Of Eels Nov 21 '13 at 17:31
  • Which tutorials? Why is it weird? – user3015246 Nov 21 '13 at 17:36
  • My code did run, BTW! Isn't String[] args for unix?I am using windows. – user3015246 Nov 21 '13 at 17:39
  • @user3015246: now String[] is needed for all main methods. If your code ran, then either you copied it wrong here, or you have another main method somewhere else that calls this code. – Hovercraft Full Of Eels Nov 21 '13 at 17:53
  • I have run so many codes without ever using String[] in main(). I thought that was for unix command line argument passing? – user3015246 Nov 21 '13 at 18:05
  • @user3015246: what jvm are you running it with? The JVM should complain that no main method has been found. Please note edit to answer. – Hovercraft Full Of Eels Nov 21 '13 at 18:10
  • **Thanks a lot for your Edit 2.** It runs with a scroller. Interesting, because the pan1 still has a null layout. I think setPrefferedSize did the trick What does > frame1.pack(); > frame1.setLocationRelativeTo(null); do?Can you please explain a little. Let me experiment a bit with your code. PS: regarding String[] main - most likely, my BlueJ IDE lets me bypass that restriction. I have version 7 JVM from Oracle's website. – user3015246 Nov 21 '13 at 18:36
  • I get better results without->frame1.setLocationRelativeTo(null); I get the frame at the preferred position. If only I could get the preferred size of the frame. – user3015246 Nov 21 '13 at 19:23