Java 如何调整JFrame和JPanel中的大小?

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

我正在用JavaGUI创建一个简单的游戏,但是我对面板的初始设计有一些问题

我希望设计是这样的(见图)

但我想我的尺寸总是有问题

如果您有任何建议,这是我的代码

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);
            }
        }
    }