如何在JFrame和JPanel中调整大小?

时间:2017-12-06 14:16:14

标签: java swing user-interface size

我正在通过Java GUI创建一个简单的游戏,但我在使用面板进行初始设计时遇到了一些问题。

我希望设计像这样(见图片)

enter image description here

但我认为我总是遇到尺码问题。

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

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

}
}

1 个答案:

答案 0 :(得分:3)

永远不要使用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);
        }
    }
}

另外,不要像正在做的那样获取图像。

更好
  1. 使用ImageIO.read(...)
  2. 如果您要将图像用作图像,则将图像作为图像获取,而不是像ImageIcons
  3. 将图像作为资源获取,而不是作为文件。
  4. 一个例子......

    enter image description here

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