2014-06-09 9 views
0

JFrame의 크기를 조정해도 배경에 그린 그림의 크기가 조정되지 않는 이유를 모르겠습니다.자바 스윙 : 크기가 화면 크기가 업데이트되지 않습니다.

기본적으로이 프레임 안에 JFrame과 JPanel을 만듭니다.

그런 다음 다른 클래스의 개체를 만드는 "setBackground"메서드로 내 배경 그림 (애니메이션 GIF)을 설정합니다. "ImagePanel"이라는 새로운 클래스에서 저는 그림을 그리고 배경 그림 위에 작은 그림을 그립니다. JFrame의 크기를 변경하지 않으면 결과가 괜찮습니다.

작은 그림이 시작 지점에 남아있는 동안 배경 그림은 크기 조정을 "따라갑니다". paintComponent()를 사용하여 두 그림을 그리고 JFrame의 너비와 높이를 기준으로 그림의 크기를 설정했지만 작동하지 않는 것 같습니다.

JFrame의 크기를 수신하기 위해 액션 리스너도 추가했습니다. 그것이 "repaint()"를 호출하는 크기 조정을 수신하지만 작동하지 않습니다 (JFrame과 JPanel에서 "revalidate()"를 성공하지 못했습니다).

JFrame이 거의 모든 화면을 덮어서 확대하면 고정 된 지점에서 작은 그림이 "업데이트"되지만 잘못된 방식으로 표시되며 JFrame이 매우 큰 경우에만 나타납니다.

다음은 코드입니다. 은 "GameWindow"클래스 : 작은 그림이 새로운 비율로 다시 그려되지 않는 이유 이해가 안

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class ImagePanel extends JPanel { 
     private ImageIcon background; 
     private JFrame parentFrame; 
     private ImageIcon smallerImage = new ImageIcon(getClass().getResource("car.png")); 

     public ImagePanel(String imgPath, JFrame parentFrame) { 
      this.parentFrame = parentFrame; 
      background = new ImageIcon(getClass().getResource(imgPath)); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.drawImage(background.getImage(), 0, 0, getWidth(), getHeight(), this); 
      g2d.drawImage(smallerImage.getImage(), 119*((parentFrame.getWidth()/768)), 172*((parentFrame.getHeight())/768), 32*((parentFrame.getWidth())/768), 32*((parentFrame.getHeight())/768),this); 
     } 
} 

: 여기

import java.awt.BorderLayout; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 



public class GameWindow extends JFrame { 
    private JPanel mapPicture = new JPanel(); 

    public GameWindow(){ 
     super("WELCOME!!!"); 
     setSize(768, 768); 
     addComponentListener(new ResizeListener(this)); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     setBackground(); 
     setVisible(true); 
    } 


    private void setBackground() { 
     mapPicture = new ImagePanel("map.gif", this); 
     add(mapPicture, BorderLayout.CENTER); 
     mapPicture.setLayout(new BorderLayout()); 
    } 


    public class ResizeListener implements ComponentListener { 
     private JFrame parentFrame; 
     public ResizeListener(JFrame parentFrame) { 
      this.parentFrame = parentFrame; 
     } 
     public void componentHidden(ComponentEvent e) {} 
     public void componentMoved(ComponentEvent e) {} 
     public void componentShown(ComponentEvent e) {} 

     public void componentResized(ComponentEvent e) { 
      repaint(); 
     } 
    } 


    public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        new GameWindow2(); 
       } 
      }); 
     } 
} 

그리고는 "ImagePanel"클래스입니다.

추 신 : 레이아웃 관리자를 사용하여 두 번째 그림의 위치를 ​​설정할 수 없습니다. 앞으로 많은 객체가지도 상에 캐주얼 한 방식으로 배치 될 것이며).

답변

1

는 정수 연산을 사용하고 증식하기 전에 분할되는 때문입니다 : 119*(parentFrame.getWidth()/768)

대신 당신이 int로 소수점 연산 캐스트 부동 : (int)(119.0*(parentFrame.getWidth()/768.0))

+0

와우 !!!!! 대단히 감사합니다 !!! 내가 대답을 유용하게 설정 하겠지만, 불행히도 나는 명성이 충분하지 않다. 그런 식으로는 상상도 못했을 것이고, 나는 또한 오류로 내게 약간 어리 석다. 나는 설명을 찾을 것이다. (나는 아직도 배우고있다.) 그러나 나는이 오류를 절대 잊지 않을 것이라고 생각한다. (당신의 대답이 즉각적이고 완벽 할 때 나는이 문제에 쓴 날을 보았다.) !! 고맙습니다. – jackal992