Java 如何调整JFrame和JPanel中的大小?
我正在用JavaGUI创建一个简单的游戏,但是我对面板的初始设计有一些问题 我希望设计是这样的(见图) 但我想我的尺寸总是有问题 如果您有任何建议,这是我的代码Java 如何调整JFrame和JPanel中的大小?,java,swing,user-interface,size,Java,Swing,User Interface,Size,我正在用JavaGUI创建一个简单的游戏,但是我对面板的初始设计有一些问题 我希望设计是这样的(见图) 但我想我的尺寸总是有问题 如果您有任何建议,这是我的代码 public class GameProject extends JFrame { ImagePanel gamePanel; Image image = null; public GameProject() { setTitle(""); setSize(1100, 900); setDefaultCl
public class GameProject extends JFrame {
ImagePanel gamePanel;
Image image = null;
public GameProject() {
setTitle("");
setSize(1100, 900);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
ImageIcon image = new ImageIcon("logo.jpg");
JLabel label = new JLabel("", image, JLabel.CENTER);
JPanel leftPanel = new JPanel(new BorderLayout());
leftPanel.setBackground(Color.LIGHT_GRAY);
leftPanel.setBounds(300, 900, 180, 110);
leftPanel.add(label, BorderLayout.WEST);
add(leftPanel);
gamePanel = new ImagePanel("SnakesLadders2.jpg");
add(gamePanel, BorderLayout.CENTER);
setVisible(true);
}
class ImagePanel extends JPanel {
public ImagePanel() {
}
public ImagePanel(String filename) {
image = new ImageIcon(filename).getImage();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
}
}
public static void main(String[] args) {
new GameProject();
}
}
切勿使用setBounds(…)
。一方面,布局管理器倾向于尊重组件的首选大小,而不是其大小;另一方面,如果您硬编码大小和位置,则几乎可以保证GUI不会在除您自己的平台之外的所有平台上正常工作。对于您的问题,如果将图像显示为JLabel中的ImageIcon,则JLabel将根据图像设置其首选大小。如果您需要在JPanel中显示图像,那么这取决于您自己。我有时会做一些事情,比如:
class ImagePanel extends JPanel {
private BufferedImage image;
public ImagePanel() {
}
public ImagePanel(String filename) {
// image = new ImageIcon(filename).getImage();
// don't get images this way.
// use ImageIO.read(URL url) and get the image as a resource
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
} else {
int w = image.getWidth();
int h = image.getHeight();
return new Dimension(w, h);
}
}
}
另外,不要像你正在做的那样获取图像。最好
ImageIO.read(…)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class SnakesAndLaddersProgram extends JPanel {
public static final String GAME_BOARD_PATH = "http://www.righttoremain.org."
+ "uk/blog/wp-content/uploads/2015/11/snakesladders.jpg";
public static final String GAME_LOGO_PATH = "https://loteries.lotoquebec.com"
+ "/loteries/___W9a9e8ef6-0c97-4d1b-a4c3-2588fee936d3___.png";
private static final double BOARD_SCALE = 0.5; // online images too big
private static final double LOGO_SCALE = 0.3; // online images too big
private ImagePanel imagePanel = null;
public SnakesAndLaddersProgram() throws IOException {
URL gameBoardUrl = new URL(GAME_BOARD_PATH);
Image gameBoard = ImageIO.read(gameBoardUrl);
// scale to size:
int w = (int) (gameBoard.getWidth(this) * BOARD_SCALE);
int h = (int) (gameBoard.getHeight(this) * BOARD_SCALE);
gameBoard = gameBoard.getScaledInstance(w, h, Image.SCALE_DEFAULT);
imagePanel = new ImagePanel(gameBoard);
URL logoUrl = new URL(GAME_LOGO_PATH);
Image logo = ImageIO.read(logoUrl);
// scale to size:
w = (int) (logo.getWidth(this) * LOGO_SCALE);
h = (int) (logo.getHeight(this) * LOGO_SCALE);
Icon logoIcon = new ImageIcon(logo);
JLabel logoLabel = new JLabel(logoIcon);
JPanel westPanel = new JPanel();
westPanel.add(logoLabel);
setLayout(new BorderLayout());
add(imagePanel, BorderLayout.CENTER);
add(westPanel, BorderLayout.LINE_START);
}
private static void createAndShowGui() {
SnakesAndLaddersProgram mainPanel = null;
try {
mainPanel = new SnakesAndLaddersProgram();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
JFrame frame = new JFrame("Snakes And Ladders");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
@SuppressWarnings("serial")
class ImagePanel extends JPanel {
private Image image;
public ImagePanel() {
}
public ImagePanel(Image image) {
this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
} else {
int w = image.getWidth(this);
int h = image.getHeight(this);
return new Dimension(w, h);
}
}
}