2

私は下の写真を実現するための最良のレイアウトマネージャーを考えようとしています。絶対ポジショニングは私が慣れているものですが、これを使用して背景画像を取得することはできません。GridBagLayout優れていますが、試してみると、グリッドごとに個別の画像を取得するのは非常に困難です。

誰かがこれからの簡単な方法、または次のことを達成するための簡単なコードを知っていますか?

ここに画像の説明を入力してください

4

2 に答える 2

4

それを行うにはいくつかの方法があります。これらは私が現時点で考えることができるものです:

  1. のサブクラスを作成しますJComponent
  2. メソッドをオーバーライドして、paintComponent(Graphics g)表示する画像をペイントします。
  3. のコンテンツペインJFrameこのサブクラスに設定します。

いくつかのサンプルコード:

class ImagePanel extends JComponent {
    private Image image;
    public ImagePanel(Image image) {
        this.image = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null);
    }
}

// elsewhere
BufferedImage myImage = ImageIO.read(...);
JFrame myJFrame = new JFrame("Image pane");
myJFrame.setContentPane(new ImagePanel(myImage));

必要に応じて、このコードは画像のサイズ変更を処理しないことに注意してくださいJFrame

于 2013-02-17T21:47:10.510 に答える
2

これを実現する方法はいくつかあります。

最も簡単なのは、すでに利用可能なものを使用することかもしれませんここに画像の説明を入力してください...

実行時に背景を拡大縮小する必要がない場合(つまり、サイズ変更不可能なウィンドウで回避できる場合)、JLabelプライマリコンテナーとしてを使用するだけで、作業が大幅に楽になります。

public class LabelBackground {

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

    public LabelBackground() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new LoginPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class LoginPane extends JLabel {

        public LoginPane() {
            try {
                setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/background.jpg"))));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.EAST;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.gridx = 0;
            gbc.gridy = 0;

            JLabel nameLabel = new JLabel("Name: ");
            nameLabel.setForeground(Color.WHITE);
            JLabel passwordLabel = new JLabel("Password: ");
            passwordLabel.setForeground(Color.WHITE);

            add(nameLabel, gbc);
            gbc.gridy++;
            add(passwordLabel, gbc);

            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx++;
            gbc.gridy = 0;
            add(new JTextField(20), gbc);
            gbc.gridy++;
            add(new JTextField(20), gbc);

            gbc.gridy++;
            gbc.insets = new Insets(10, 2, 2, 2);
            gbc.anchor = GridBagConstraints.EAST;
            add(new JButton("Submit"), gbc);

        }

    }

}

左揃えの例で更新

コンストラクターの最後に、...を追加します。

JPanel filler = new JPanel();
filler.setOpaque(false);
gbc.gridx++;
gbc.weightx = 1;
add(filler, gbc);

ここに画像の説明を入力してください

詳細については、GridBagLayoutの使用方法をご覧ください。

于 2013-02-17T23:00:40.527 に答える