2015-12-10 25 views
0

我想在一個JFrame動畫幾個JPG文件內畫,我會告訴你一些提取物:擴展的JFrame圖片只有原來的界限

super(title); 
setLayout(null); 
setResizable(false); 
setSize(Settings.windowWidth, Settings.windowHeight); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setLocationRelativeTo(null); 
setVisible(true); 

我的類的構造函數

我的類構造函數擴展JPanel

i = new ImageIcon(image).getImage(); 
setSize(i.getWidth(this),i.getHeight(this)); 
setBounds(x, y, i.getWidth(this), i.getHeight(this)); 

被覆蓋的方法

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(i, getX(), getY(), null); 
} 

是的,我知道null佈局是不可取的,但除非你有更好的絕對定位的想法,我會堅持下去。

上面的代碼在(x,y)處開始繪製圖像,但不是完全繪製圖像。 50和100就說明這一點:

enter image description here

,這是相當多:這隻能從0,0畫(圖像尺寸),256x256的框內的圖像,無論它已遷往。

任何建議,幫助,解決方案,建議? 如果你需要更多的代碼,問我,只是不喜歡把周圍的一切都在它這裏,太;)

+1

*「如果您需要更多代碼,請問我,就是不想將它放在這裏。」 - 通常您應該發佈一個可運行的[mcve]我們。 –

+0

*「是的,我知道零布局是不可取的,但除非你有更好的絕對定位的想法,我會堅持現在。」* - 我有很多的建議,但沒有進一步的背景,你是什麼試圖實現它不可能提出建議 – MadProgrammer

+0

好吧,謝謝你,下次我會考慮到這一點! –

回答

3

我的直覺是你不明白的繪畫實際上是如何工作的組成部分......

首先,你這樣做......

i = new ImageIcon(image).getImage(); 
setSize(i.getWidth(this),i.getHeight(this)); 
setBounds(x, y, i.getWidth(this), i.getHeight(this)); 

然後你這樣做......

g.drawImage(i, getX(), getY(), null); 

它似乎是將圖像繪製在與組件原點偏移的位置,但由於該組件的大小與圖像大小相匹配,因此ima ge在組件邊界處裁剪。

當組件被繪製時,Graphics上下文的原點被設置爲組件的位置,這意味着0x0現在是組件的頂部/左邊角落。

您可以通過使用setBorder(new LineBorder(Color.RED))測試,它會顯示你的組件

的物理界限在你的情況,像

g.drawImage(i, 0, 0, this); 

在你的情況,你應該移動的部件不圖片。

就個人而言,我會使用BorderLayoutJPanel添加到JFrame,那麼您可以簡單地將圖像移動到組件上下文中的任何位置。記住要覆蓋getPreferredSize爲您的目的返回適當的大小,以便框架可以更有效地包裝在它周圍。

這是棘手做動畫與組分(並非不可能,但只是很多考慮),一般直接畫到像JPanel畫布只是比較容易,但是這是我

Painting in AWT and SwingPerforming Custom Painting有關繪畫如何工作的更多細節

+0

是的,我仍然沒有100%進入秋千,這是問題,謝謝兄弟! :d –

4

有沒有需要定製油畫:

  1. 的的ImageIcon添加到JLabel並將JLabel添加到JPanel中
  2. 當您想爲其設置動畫時,更改面板上標籤的位置。

或者,如果您進行自定義繪畫,則不需要空佈局。

  1. 您覆蓋JPanel的getPreferredSize()方法並將面板添加到框架。
  2. 然後在paintComponent()方法中,您可以根據您設置的首選大小的範圍來繪製圖像。