2

私は Java で JFrames を使用しています。具体的には、オーバーラップする必要がある絶対配置要素を使用しています。setOpacity(false);コンポーネントをオーバーレイするには、JPanel ( with ) を作成し、それをsetBounds(x,y,x2,y2);またはsetPosition(x,y)&で配置する必要があることを理解していますsetSize(x,y)。残念ながら、パネルは CSS のように動作しinline-divsます。それらはライン上で必要な量のスペースのみを占有し、スタックしません。

これは私がこれまでに持っているコードですが、私が想像するように動作していないようです:

class Login extends JFrame {
    private JPanel         backgroundpanel;
    private JPanel         panel;
    private JPanel         panel2;
    private JTextField     usernameBox;
    private JPasswordField passwordBox;
    private JButton        button;
    private int            height = 319;
    private int            width  = 452;
    private ImageIcon      ii     = new ImageIcon("special-window-BG.png");
    private JLabel         image;

    public Login() {
        setLayout(null);
        setTitle("Login");
        setSize(width,height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        buildPanel();

        add(backgroundpanel);
        setVisible(true);
    }

    private void buildPanel() {
        usernameBox = new JTextField(20);
        passwordBox = new JPasswordField(20);
        button = new JButton("Login");
        image = new JLabel(ii);

        backgroundpanel = new JPanel();
        panel = new JPanel();
        panel2 = new JPanel();

        backgroundpanel.add(panel);
        backgroundpanel.add(panel2);
        backgroundpanel.add(image);

        panel.setBackground(Color.red);
        panel.setBounds(0, 0, 10, 10);
        panel.setOpaque(false);

        panel2.setBackground(Color.blue);
        panel2.setBounds(0, 0, 10, 10);
        panel2.setOpaque(false);

        panel.add(passwordBox);
        panel2.add(button);

        backgroundpanel.setOpaque(false);
        backgroundpanel.isOptimizedDrawingEnabled();
        backgroundpanel.setBounds(0, 0, width, height);

...cot'd、しかし不要です。

したがって、基本的には、JPanel (またはそれが簡単な場合は JComponents) を背景画像付きの JPanel の上に絶対に配置する方法を知りたいと思います。

この質問を見てくれてありがとう、私はこの方法にあまりにも多くの時間を費やしました。コメントアウトされたコードは、私が投稿したものよりも 500 行近くも拡張​​されているため、他に参照する場所がありません。下の画像は、私が達成しようとしていることの大まかな図を示しています。JComponents が背景画像の背後にあるかのように消えることがあるため、実際にまだ取得に近づいているかどうかはわかりませんが、目の前にありそうなシンプルな解決策を見つけたい!

http://i.stack.imgur.com/revz8.jpg

4

2 に答える 2

4

目の前にありそうなシンプルな解決策を見つけたい!

このようなもの?

ログインパネル

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class LoginPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    BufferedImage image;

    LoginPanel(BufferedImage image) {
        super(new GridBagLayout());

        this.image = image;

        JPanel controls = new JPanel(new BorderLayout(15,35));
        controls.setOpaque(false);
        controls.setBorder(new EmptyBorder(110,0,0,0));

        JPanel fields = new JPanel(new GridLayout(0,1,30,30));
        fields.setOpaque(false);
        controls.add(fields, BorderLayout.CENTER);
        fields.add(new JTextField(20));
        fields.add(new JPasswordField(20));

        JPanel button = new JPanel(new GridBagLayout());
        button.setOpaque(false);
        controls.add(button, BorderLayout.PAGE_END);
        button.add(new JButton("Log In"));

        Dimension prefSize = new Dimension(image.getWidth(),image.getHeight());
        setPreferredSize(prefSize);

        add(controls);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/revz8.jpg");
        final BufferedImage image = ImageIO.read(url); 
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                LoginPanel p = new LoginPanel(image);
                JOptionPane.showMessageDialog(null, p);
            }
        });
    }
}
于 2012-06-07T11:27:58.533 に答える
3

「backgroundpanel」(デフォルトでは)に設定されていますが、設定setLayout(null)されていません。JFrameFlowLayout

Loginフレームのレイアウトはデフォルトで設定されているため、設定しないでください。問題はありませんBorderLayout(「backgroundpanel」を親に合わせて拡大する必要があります)。代わりsetLayout(null)JPanel、任意の位置に配置されたパネルを追加する「backgroundpanel」に。

于 2012-06-07T11:23:45.420 に答える