2014-06-09 184 views
0

我不明白爲什麼在我的背景上繪製的圖片未在JFrame調整大小時調整大小。Java Swing:圖片大小不會更新調整大小

基本上我在這個框架內創建一個JFrame和一個JPanel。

然後我用創建另一個類的對象的方法「setBackground」設置我的背景圖片(動畫gif)。在這個名爲「ImagePanel」的新類中,我繪製圖片並在背景圖片上繪製另一個較小的圖片。結果是好的,除非我調整JFrame的大小。

背景圖片「跟隨」調整大小,而較小的圖片保留在開始點。我用paintComponent()繪製了兩張圖片,並且我在JFrame的寬度和高度的基礎上設置了圖片的尺寸,但它似乎不起作用。

我還添加了一個動作偵聽器,以偵聽JFrame上的調整大小。當它偵聽調整大小時,它會調用「repaint()」,但它不起作用(我也在JFrame和JPanel上嘗試了「revalidate()」,但都沒有成功)。

看起來,當你放大幾乎覆蓋所有屏幕的JFrame時,它有一個更新,在一個固定的點上,較小的圖片是「更新」但錯誤的方式,只有當JFrame非常大時。

這是代碼。該「GameWindow」類:

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」類:

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

我不明白爲什麼小圖片不符合新的比例重繪。

PS:我不能使用佈局管理器來設置第二張圖片的位置,因爲我會在地圖上放置很多對象(並且可能會對它們進行動畫處理)。

回答

1

那是因爲你使用的是整數運算和相乘之前將:119*(parentFrame.getWidth()/768)

,而不是你浮點運算,並轉換爲int:(int)(119.0*(parentFrame.getWidth()/768.0))

+0

哇!!!!!非常感謝你!!!我會把答案設置爲有用的,但不幸的是我沒有足夠的聲望..但我從來沒有想過這樣的事情,而且對我來說這也是一個荒謬的錯誤,我會尋找一個解釋,(我仍然在學習),但我想我永遠不會忘記這個錯誤(看到我在這個問題上度過的那些日子,而你的答案是直接和完美的)!謝謝vandale! – jackal992