3

ImageIcon()を持つJLabelがあるJPanelを持つJFrameを持っています。すべてが完全に機能しています。問題は、ボタンなどの他のすべてのものを含む別のJPanelをJFrameに追加したいということです。ただし、背景画像が一番上に表示され、2番目のJPanelには何も表示されません。

誰かが私を助けることができますか?これが私のコードの抜粋です:

JFrame window = new JFrame("Http Download");


/*
 * Background Section
 */
JPanel panel1 = new JPanel();

JLabel lbl1 = new JLabel();


/*
 * Component Section
 */
JPanel panel2 = new JPanel();

JLabel lbl2 = new JLabel();


/*
 * Dimension Section
 */
Dimension windowSize = new Dimension(800, 600);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

public HTTPDownloadGUI() {

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel1.setLayout(null);
    panel1.setSize(windowSize);
    panel1.setOpaque(false);

    panel2.setLayout(null);
    panel2.setSize(windowSize);
    panel2.setOpaque(false);

    lbl1.setSize(windowSize);
    lbl1.setLocation(0, 0);
    lbl1.setIcon(new ImageIcon(getClass().getResource("bg1.png")));
    panel1.add(lbl1);

    lbl2.setBounds(0, 0, 100, 100);
    //lbl2.setIcon(new ImageIcon(getClass().getResource("bg2.png")));
    lbl2.setBackground(Color.GREEN);
    panel2.add(lbl2);

    panel1.add(panel2);

    window.add(panel1);

    int X = (screen.width / 2) - (windowSize.width / 2);
    int Y = (screen.height / 2) - (windowSize.height / 2);

    window.setBounds(X,Y , windowSize.width, windowSize.height);
    window.setVisible(true);

}
4

3 に答える 3

2
  1. null レイアウトは避けてください。
  2. フレームをレイアウトに設定するBorderLayout
  3. フレームにラベルを追加する
  4. ラベルのレイアウトをBorderLayout
  5. パネルを作成し、その opaque プロパティを false に設定します
  6. 通常どおりに他のコンポーネントを追加します
  7. パネルをラベルに追加する

チェックアウト

例えば

例で更新

  • panel1主な背景です...
  • のレイアウトpanel1BorderLayout
  • lbl1に追加panel1
  • のレイアウトlbl1BorderLayout
  • panel2のレイアウトを使用したいものに設定します...
  • panel2の opacity プロパティをfalse( panel2.setOpacity(false))に設定します
  • lbl2に追加panel2
  • panel2に追加lbl1
  • panel1あなたが望むすべてのものに追加してください。

ここに画像の説明を入力

public class TestLayout17 {

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

    public TestLayout17() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        /*
         * Background Section
         */
        JPanel panel1 = new JPanel();
        JLabel lbl1 = new JLabel();
        /*
         * Component Section
         */
        JPanel panel2 = new JPanel();
        JLabel lbl2 = new JLabel();
        /*
         * Dimension Section
         */
        Dimension windowSize = new Dimension(800, 600);
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

        public TestPane() {

            setLayout(new BorderLayout());

            panel1.setLayout(new BorderLayout());

            lbl1.setLayout(new BorderLayout());
            URL url = getClass().getResource("/bg1.gif");
            System.out.println(url);
            try {
                BufferedImage image = ImageIO.read(url);
                Image smaller = image.getScaledInstance(-1, image.getHeight() / 2, Image.SCALE_SMOOTH);
                lbl1.setIcon(new ImageIcon(smaller));
            } catch (Exception e) {
                e.printStackTrace();
            }
//            lbl1.setIcon(new ImageIcon(url));
            panel1.add(lbl1);

            add(panel1);

            panel2.setLayout(new GridBagLayout());
            panel2.setOpaque(false);

            lbl2.setBorder(new EmptyBorder(8, 8, 8, 8));
            lbl2.setBackground(Color.GREEN);
            lbl2.setText("Say hello");;
            lbl2.setOpaque(true);
            panel2.add(lbl2);

            lbl1.add(panel2);

        }
    }
}
于 2012-12-14T21:39:59.017 に答える
1

何も表示されていないように見えるのpanel2は、表示するものがないためです。のテキストを設定するだけlbl2で、JPanelそれ自体が表示されていることがわかります。

JLabel lbl2 = new JLabel("Some text");

ただし、レイアウトマネージャーが簡単に管理できるnull場所と寸法を設定するために開発者にオーバーヘッドがかかるため、レイアウトを使用しないことをお勧めします。

于 2012-12-14T21:56:42.430 に答える
0

MadProgrammer のアドバイスに従うことをお勧めします。null レイアウトを使用することを選択した場合は、前のものを削除しJPanelて新しいものをコンテンツ ペインに追加しwindow.setContentPane(panel2);window.repaint().

于 2012-12-14T21:46:04.730 に答える