私は下の写真を実現するための最良のレイアウトマネージャーを考えようとしています。絶対ポジショニングは私が慣れているものですが、これを使用して背景画像を取得することはできません。GridBagLayout
優れていますが、試してみると、グリッドごとに個別の画像を取得するのは非常に困難です。
誰かがこれからの簡単な方法、または次のことを達成するための簡単なコードを知っていますか?
私は下の写真を実現するための最良のレイアウトマネージャーを考えようとしています。絶対ポジショニングは私が慣れているものですが、これを使用して背景画像を取得することはできません。GridBagLayout
優れていますが、試してみると、グリッドごとに個別の画像を取得するのは非常に困難です。
誰かがこれからの簡単な方法、または次のことを達成するための簡単なコードを知っていますか?
それを行うにはいくつかの方法があります。これらは私が現時点で考えることができるものです:
JComponent
。paintComponent(Graphics g)
表示する画像をペイントします。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
。
これを実現する方法はいくつかあります。
最も簡単なのは、すでに利用可能なものを使用することかもしれません...
実行時に背景を拡大縮小する必要がない場合(つまり、サイズ変更不可能なウィンドウで回避できる場合)、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の使用方法をご覧ください。