2011-04-12 42 views
0

事實證明,這比我想象的要困難得多。我只是在進行一些學習,並利用繪圖功能。我想要的是程序啓動一個包含矩形的窗口。該矩形的大小將根據窗口的大小進行縮放(即,如果窗口爲1000px,並且矩形設置爲按90%縮放,則矩形將爲900px)。我有數學計算出如何居中並確定它的大小,但通過使用存根,我發現使用object.getWidth()和高度等,每次都返回0,完全算數漿紗。試圖讓它在加載時自己畫一個窗口

想了一會兒之後,我假設它是因爲它試圖從一個仍在構建的對象中獲取寬度和高度。按照我自己的邏輯,只要你在構造函數的構建部分之後做數學,它應該沒問題,但是可惜 - 我看起來是錯的。

我試着創建獨立的類,創建一個框架和一個使繪圖。繪圖對象接受一個JFrame作爲構造函數的一部分,並嘗試繪製它。我分別實例化每一個,先框架,然後繪製對象(發送幀對象),但似乎也沒有工作。

有什麼建議嗎?

編輯:

安德魯的建議。這裏將被添加到窗口

package scaling_test; 
import java.awt.*; 
import javax.swing.*; 

public class MyDrawing extends JPanel 
{ 

    public MyDrawing() throws HeadlessException 
    { 
     this.setVisible(true); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponents(g); 
     //set scaling 
     int usrScale = 90; 
     int scaleRef = (100 - usrScale)/2; 
     int xStart = this.getWidth() * (scaleRef/100); 
     int yStart = this.getHeight() * (scaleRef/100); 
     int width = (usrScale/100) * this.getWidth(); 
     int height = (usrScale/100) * this.getHeight(); 

     //draw square outline 
     g.setColor(Color.green); 
     g.fillRect(xStart, yStart, width, height); 
    } 
} 

我的面板對象這是並稱的JPanel對象的窗口:

package scaling_test; 
import java.awt.*; 
import javax.swing.*; 

public class DrawThis extends JFrame 
{ 
    MyDrawing drawing; 

    public DrawThis() throws HeadlessException 
    { 
     drawing = new MyDrawing(); 
     this.add(drawing); 
    } 
} 

而且啓動

package scaling_test; 

public class ScaleTest 
{ 
    public static void main(String[] args) 
    { 
     DrawThis program = new DrawThis(); 
     program.setBounds(250, 250, 800, 600); 
     program.setVisible(true); 
    } 
} 

更新面板(仍犯規工作):

package scaling_test; 
import java.awt.*; 
import javax.swing.*; 

public class MyDrawing extends JPanel 
{ 

    public MyDrawing() throws HeadlessException 
    { 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponents(g); 

     //set scaling 
     int usrScale = 90; 
     int scaleRef = (100 - usrScale)/2; 
     int xStart = this.getWidth() * scaleRef/100; 
     int yStart = this.getHeight() * scaleRef/100; 

     int width = usrScale * this.getWidth()/100; 
     int height = usrScale * this.getHeight()/100; 

     //draw square outline 
     g.setColor(Color.green); 
     g.fillRect(xStart, yStart, width, height); 
    } 
} 
+0

編輯過的版本可以正常工作,並且完全按照程序進行編程(繪製一個居中的綠色填充矩形,按照組件尺寸的90%縮放) - 那麼您的期望究竟是什麼? – kleopatra 2011-04-12 08:25:18

回答

2

當paintComponent(...)方法傳遞Graphics對象時,爲什麼要使用getGraphics(...)方法?另外,您應該調用super.paintComponent(g)作爲方法中的第一條語句。我不知道你爲什麼評論它。

閱讀Swing教程中關於Custom Painting的部分以獲取工作示例。

如果您需要更多的幫助,然後發佈您的SSCCE,所以我們不會猜測你的實際代碼是什麼樣子。

編輯:

你加任何顯示報表,看看是否在drawRect中(...)方法中使用的值作出任何意義嗎?不要以爲你的數學論壇是正確的。對於一件事,你需要了解如何計算工作整數:

//  int width = (usrScale/100) * this.getWidth(); 
//  int height = (usrScale/100) * this.getHeight(); 
     int width = usrScale * this.getWidth()/100; 
     int height = usrScale * this.getHeight()/100; 

在註釋掉的代碼(usrScale/100)= 0,因爲乘法完成之前該值轉換爲整數。

+0

我嘗試過和沒有你提到的兩件事。它沒有改變任何東西。你會看到我離開的代碼 – Sinaesthetic 2011-04-12 03:34:52

+0

@Sinaesthetic,請參閱編輯。也是下次發佈適當的SSCCE。我們不能執行你的代碼,因爲它沒有main()方法。 – camickr 2011-04-12 04:08:45

+0

我提到過我添加了存根以檢查getWidth()和getHeight()返回的內容。他們正在返回正確的值,儘管重複,而不是一次,因爲程序似乎崩潰了 - 我不得不將它放在paintComponent()中,以便在實現後得到結果。您對我的配方的編輯產生的結果不正確的一個因素。我回去嘗試使用雙打,然後在將其發送到fillRect方法之前轉換回整數。相同的結果。我也提到它是由一個啓動器啓動的。沒有什麼花哨。我會將它添加到我的帖子中... – Sinaesthetic 2011-04-12 04:23:39

-1

沒有看到你的代碼有點棘手,但一個選擇是setPreferredSize(x,y);在JFrame上,然後調用pack();之後,您可以檢查窗口大小。

+0

不 - 這個答案錯誤的原因有幾個:a)隨機方法調用時不知道發生了什麼問題總是不好的。 b)永遠不要在應用程序代碼中調用setXX(XX == min/max/pref)。相反,如果合適,在DrawPanel上實現getXXSize(這裏可能會也可能不會,這取決於OP的意圖)c)在這個例子中,沒有理由更喜歡使用setBounds來包裝:「實現」框架,即所有位置/寬度設置容器層次結構中的組件。 – kleopatra 2011-04-12 08:39:30

+0

哇,被低估是令人驚訝的痛苦,雖然我認爲我誤解了這個問題,所以它可能是合理的。但無論如何,爲什麼不應該調用setPreferredSize,似乎永遠不會?不是所有的代碼「應用程序代碼」?那麼爲什麼那裏的方法呢? – AlbeyAmakiir 2011-04-12 23:13:42

+0

對不起,造成疼痛,但好......不正確的答案是不正確的答案;-)至於爲什麼不使用,請參閱http://wiki.java.net/twiki/bin/view/Javadesktop/SwingLabsImperialRules(看起來由於java.net遷移可怕)。至於全是應用程序:並不是真的,框架代碼的規則略有不同。至於它爲什麼在那裏:不知道,也許作爲最後的手段?實際上,它是用於複合組件的ui委託代碼中的方法(我認爲其中一個是xxComboBoxUI,但不指定,現在沒有檢查) – kleopatra 2011-04-13 13:16:04

2

paintComponent(Graphics)方法中的計算JPanel添加到JFrame。只有在屏幕上「實現」組件時纔會調用paintComponent()方法。

+0

我把一個存根顯示對象的寬度......它的讀數一個寬度而不是0,但仍然沒有顯示 – Sinaesthetic 2011-04-12 03:02:32

+0

這實際上結束了使用普通的paint()方法。 – Sinaesthetic 2011-04-14 22:49:29

+0

您是否堅持使用'JFrame'(它沒有'paintComponent(Graphics)'方法)或'JPanel'(它有)? – 2011-04-14 23:12:06

相關問題