-2
  1. how to solve hidding of components in this code
  2. code is running without errors
  3. but background image not displayed
  4. how to change code to get the background image
  5. when using validation method, its creating error in validation()

       public class TEST{
        public TEST() {  
          String[] strm = {"Jan", "Feb", "Mar", "Apr", "May"};
           String[] stry = {"2016", "2017", "2018","2019"};
           String[] strf={"NEW Delhi", "Bangalore", "Chennai"};
           String[] strt={"Goa","Kashmir","Hyderabad"};
           JFrame f = new JFrame("test");
           f.setSize(500, 500);
           f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           JLabel lfr = new JLabel("FROM");
           JLabel lto = new JLabel("TO");
           JLabel lda = new JLabel("DATE");
           JLabel ld = new JLabel("DAY");
           JLabel lm = new JLabel("MONTH");
           JLabel y = new JLabel("YEAR");
           JComboBox cfr = new JComboBox(strf);
           JComboBox cto = new JComboBox(strt);
           JComboBox cd = new JComboBox();
           JComboBox cm = new JComboBox(strm);
           JComboBox cy = new JComboBox(stry);
           JButton bs = new JButton("Search");
           JPanel p1 = new JPanel(null);
           p1.setPreferredSize(new Dimension(500,500));
           JLabel jimage = new JLabel();
           jimage.setIcon(new ImageIcon("air.jpg"));
    
    
           for(int i = 1; i <= 31; i++)
               cd.addItem(i);
           lfr.setBounds(20, 40, 100, 20);
           cfr.setBounds(100, 40, 100, 20);
           lto.setBounds(20, 100, 25, 20);
           cto.setBounds(100, 100, 100, 20);
           lda.setBounds(20, 160, 50, 20);
           cd.setBounds(100, 160, 50, 20);
           cm.setBounds(160, 160, 65, 20);
           cy.setBounds(240, 160, 75, 20);
           ld.setBounds(100, 190, 50, 20);
           lm.setBounds(160, 190, 50, 20);
           y.setBounds(240, 190, 50, 20);
           bs.setBounds(20, 230, 100, 20);
           p1.add(lfr);
           p1.add(cfr);
           p1.add(lto);
           p1.add(cto);
           p1.add(lda);
           p1.add(cd);
           p1.add(cm);
           p1.add(cy);
           p1.add(ld);
           p1.add(lm);
           p1.add(y);
           p1.add(bs);
           p1.add(jimage);
          // validate();
    
           f.add(p1);
    
           f.setVisible(true);
        }
    
      public static void main(String[] args) {
          new TEST();
      }
    
    }
    
  • 1
    Don't use a NULL layout!!! It gives you a lot of problems! See [Why is it frowned upon to use a null layout](http://stackoverflow.com/questions/6592468/why-is-it-frowned-upon-to-use-a-null-layout-in-swing) and [Null Layout is Evil](http://www.leepoint.net/GUI/layouts/nulllayout.html) to see why. – Frakcool Jun 09 '16 at 17:38
  • @Frakcool could it sove the issue of background image hiding the other components – anuj bajpai Jun 09 '16 at 18:14

1 Answers1

1

The best you can do is something like:

import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {
    JLabel label;
    JComboBox combo;
    JButton button;
    JPanel pane;
    JFrame frame;

    JPanel create1stRow() {
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout(FlowLayout.LEFT));
        pane.setOpaque(false);
        String options[] = {"New Delhi", "Bangalore", "Chennai"};
        label = new JLabel("FROM");
        combo = new JComboBox(options);

        pane.add(label);
        pane.add(combo);
        return pane;
    }

    JPanel create2ndRow() {
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout(FlowLayout.LEFT));
        pane.setOpaque(false);
        String options[] = {"Goa", "Kashmir", "Hyderabad"};
        label = new JLabel("TO");
        combo = new JComboBox(options);

        pane.add(label);
        pane.add(combo);
        return pane;
    }

    JPanel create3rdRow() {
        JPanel pane = new JPanel();
        JPanel dataPane = new JPanel();
        pane.setLayout(new FlowLayout(FlowLayout.LEFT));
        pane.setOpaque(false);
        dataPane.setOpaque(false); //forgot to add this line when I took the pic
        dataPane.setLayout(new GridLayout(2, 3)); //2 rows, 3 cols, so we can have the combos with their text aligned

        String days[] = {"1", "2", "3", "4", "5"}; //Too lazy to write 31 days
        String months[] = {"Jan", "Feb", "Mar", "Apr", "May"}; //Too lazy to write 12 months
        String years[] = {"2016", "2017", "2018", "2019", "2020"};
        label = new JLabel("DATE");
        combo = new JComboBox(days);

        //We add the combos
        dataPane.add(combo);
        combo = new JComboBox(months); //We're reusing the object, but change the data
        dataPane.add(combo);
        combo = new JComboBox(years); //The same as above
        dataPane.add(combo);

        //Now we add the labels
        dataPane.add(new JLabel("DAYS"));
        dataPane.add(new JLabel("MONTHS"));
        dataPane.add(new JLabel("YEARS"));

        pane.add(label);
        pane.add(dataPane); //We add the whole pane to another one
        return pane;
    }

    JPanel create4thRow() {
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout(FlowLayout.LEFT));
        pane.setOpaque(false);
        button = new JButton("Search");

        pane.add(button);
        return pane;
    }

    public Test() {
        frame = new JFrame("Test");
        frame.setContentPane(new JLabel(new ImageIcon("C:/Users/Frakcool/workspace/StackOverflowProjects/src/test/Air.jpg")));
        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));

        pane = create1stRow();
        frame.add(pane);
        pane = create2ndRow();
        frame.add(pane);
        pane = create3rdRow();
        frame.add(pane);
        pane = create4thRow();
        frame.add(pane);

        frame.pack();
        //frame.setSize(500, 500); //If your image is too large use this
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main (String args[]) {
        new Test();
    }
}

As you can see in the above code, I'm not using a null layout but a combination of multiple Layout Managers and I suggest you to do it like this in the future.

But if you still want to use that ugly null layout, you were missing this line:

jimage.setBounds(0, 0, 500, 500);

before this one:

lfr.setBounds(20, 40, 100, 20);

The output that my above code gives is:

enter image description here

And the output given by your code with the line I added is:

enter image description here

As you can see, both are really similar, and I could have done them identical but I don't have enough time to do so, but you can by combining the Layout Managers I posted above.


Note: I forgot to mention that to make this program to show the background image, I needed to make every other panels not opaque with pane.setOpaque(false); so, be sure to use this whenever you need to show something that is behind another panel.

Frakcool
  • 10,915
  • 9
  • 50
  • 89