2017-12-06 3 views
2

Java GUI로 간단한 게임을 만들지 만, 패널을 사용한 초기 디자인에는 몇 가지 문제가 있습니다.JFrame 및 JPanel에서 크기를 조정하는 방법은 무엇입니까?

나는 디자인 (그림 참조)

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

} 
} 

답변

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

또한 이미지를 가져 오지 마십시오. 당신이 아닌 파일로, 리소스로 이미지를 얻을하지 ImageIcons

  • 로, 다음, 이미지로 이미지를 사용하는 이미지로 이미지를 얻기 위하여려고하는 경우

    1. 사용 ImageIO.read(...)
    2. 에 더 나은.

    예 .....

    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); 
         } 
        } 
    } 
    
  • 관련 문제