Начните с прочтения Размещение компонентов внутри контейнера и Как использовать BorderLayout , который является макетом по умолчанию, используемым JFrame
I рассмотрит возможность использования GridBagLayout
вместо (в качестве отправной точки), например ...
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
class Main extends JFrame {
public static void main(String[] args0) {
try {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 0.9;
gbc.weighty = 0.9;
gbc.fill = GridBagConstraints.BOTH;
URL url = new URL("http://www.digitalphotoartistry.com/rose1.jpg");
ImageIcon image = new ImageIcon(url);
JLabel imageLabel = new JLabel(image);
frame.add(imageLabel, gbc);
gbc.weightx = 0.9;
gbc.weighty = 0.1;
gbc.fill = GridBagConstraints.NONE;
JButton b = new JButton("Click Here");
frame.add(b, gbc);
frame.pack();
frame.setVisible(true);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Однако вы обнаружите, что при изменении размера кадра изображение не меняется, это потому, что JLabel
не поддерживает эту функцию
Лично я бы свернул свой собственный компонент, который мог бы изменить размер изображения так, как мне бы хотелось. Например, см. Java: поддержание соотношения сторон фонового изображения JPanel