- how to solve hidding of components in this code
- code is running without errors
- but background image not displayed
- how to change code to get the background image
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(); } }

- 87
- 7
-
1Don'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 Answers
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:
And the output given by your code with the line I added is:
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.

- 10,915
- 9
- 50
- 89