背景图像隐藏其他组件,如按钮标签和其他组件,反之亦然

时间:2016-06-09 16:47:28

标签: java swing jlabel

  1. 如何解决此代码中隐藏组件的问题
  2. 代码正在运行,没有错误
  3. 但未显示背景图片
  4. 如何更改代码以获取背景图像
  5. 使用验证方法时,在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 个答案:

答案 0 :(得分:1)

你能做的最好的事情就是:

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();
    }
}

正如您在上面的代码中所看到的,我没有使用null layout,而是使用多个Layout Managers的组合,我建议您将来这样做。

但是如果你仍然想要使用那个丑陋的null布局,你就错过了这一行:

jimage.setBounds(0, 0, 500, 500);
在此之前

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

上面代码提供的输出是:

enter image description here

您的代码在我添加的行中给出的输出是:

enter image description here

正如你所看到的,两者都非常相似,我可以把它们完全相同,但我没有足够的时间这样做,但你可以通过组合我上面发布的布局管理器。

注意:我忘了提到为了让这个程序显示背景图像,我需要使用pane.setOpaque(false);使其他所有面板都不透明,所以每次都要使用它你需要展示另一个小组背后的东西。