2013-07-06 90 views
3

我在AWT上關注Java : The complete reference 8th edition (JDK 7)的示例,並且我無法在出現的窗口上顯示字符串。大小和標題設置正確,窗口出現。如果我在paint()方法的控制檯上輸出字符串,我發現它實際上被調用了幾次,但字符串沒有出現在我的應用程序的窗口中。我看不出從這個例子中分歧的地方;其實,我有點不太碼(他們增加了鼠標偵聽器和一個按鍵偵聽器):\Java AWT drawString()不顯示在窗口上

import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class Main { 
    public static void main(String[] args) { 
     Application app = new Application(); 
     app.setSize(new Dimension(640, 480)); 
     app.setTitle("This is a test"); 
     app.setVisible(true); 
    } 
} 

class MyWindowAdapter extends WindowAdapter { 
    public void windowClosing(WindowEvent we) { 
     System.exit(0); 
    } 
} 

class Application extends Frame { 
    public Application() { 
     addWindowListener(new MyWindowAdapter()); 
    } 

    public void paint(Graphics g) { 
     System.out.println("Hey hey !"); 
     g.drawString("Test", 10, 10); 
    } 
} 
+1

@MadProgrammer我沒有看到調用setVisible的xD應該叫super.paint()的討論 – nachokk

+1

@nachokk +1 for'super.paint()'...但真正的問題是爲什麼AWT? – MadProgrammer

+1

爲什麼選擇AWT而不是Swing?在[Swing extras over AWT]上看到這個答案(http://stackoverflow.com/a/6255978/418556)有很多很好的理由放棄使用AWT組件。如果您需要支持較老的基於AWT的API,請參閱[混合重量級和輕量級組件](http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)。 –

回答

4

您遇到的問題是,你是在框架的頂部直接畫的事實。該框架還包括框架邊框,因此位置0,0(或您的情況10,10)實際上隱藏在框架邊框的下方。

您可以查看更多關於here的信息。

相反,你應該畫到Canvas並添加到幀

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class BadFrame { 

    public static void main(String[] args) { 
     new BadFrame(); 
    } 

    public BadFrame() { 
     Application app = new Application(); 
     app.setSize(new Dimension(640, 480)); 
     app.setTitle("This is a test"); 
     app.setLayout(new BorderLayout()); 
     app.add(new MyCanvas()); 
     app.setVisible(true); 
    } 

    class MyWindowAdapter extends WindowAdapter { 

     public void windowClosing(WindowEvent we) { 
      System.exit(0); 
     } 
    } 

    public class MyCanvas extends Component { 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      System.out.println("Hey hey !"); 
      g.drawString("Test", 10, 10); 
     } 

    } 

    class Application extends Frame { 

     public Application() { 
      addWindowListener(new MyWindowAdapter()); 
     } 

    } 
} 

想到的是,爲什麼AWT接下來的問題?這個API已經被搖身變成了Swing。如果不出意外,它會自動雙緩衝;)

PS-你也可以找到一些利益2D Graphics,特別是對文本

1

你的字符串被繪製,但窗口的標題欄下是隱藏的。只需使用例如

g.drawString("Test", 10, 200); 

,你會看到它出現

+0

是的,但是爲什麼?此外,開發人員應該不鼓勵將油漆直接塗抹到頂層容器上,特別是因爲OP有問題... – MadProgrammer

+0

@MadProgrammer:超級類中的油漆會繪製所有的窗口裝飾等等afaik這意味着0,0不能佔標題欄。你的例子比較好,但是爲了用書中的某些東西做實驗,我不認爲直接使用paint()是一件大事。我會假設OP不想把它作爲商業組件發佈 – Neiti01

+0

不要告訴我,告訴OP;) – MadProgrammer