2014-07-14 74 views
0

沒有按下按鈕時發生,我做錯了什麼?我想要按下按鈕繪製矩形。代碼有什麼問題?矩形沒有出現

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.geom.*; 

    class rectangle{ 
    public static void main(String args[]){ 
     EventQueue.invokeLater(new Runnable(){ 
      public void run(){ 
       final JFrame frame=new JFrame("RECTANGLE"); 
       final JPanel panel=new JPanel(); 
       JButton button=new JButton("DRAW"); 
       panel.add(button); 
       frame.add(panel); 
       frame.setSize(400,400); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       button.addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent event){ 
         panel.add(new drawrectangle()); 
        } 
       }); 
      } 
     }); 
    } 
} 

class drawrectangle extends JComponent{ 
    public void paintComponent(Graphics g){ 
     Graphics2D g2=(Graphics2D) g; 
     g2.setPaint(Color.PINK); 
     Rectangle2D rect=new Rectangle2D.Double(50,50,200,200); 
     g2.draw(rect); 
     g2.fill(rect); 
    } 
} 
+1

到downvoter:這可能不是有史以來最偉大的問題,但它是相當小,顯示的問題,顯然是一個完整的,自包含的示例說明預期的結果(你看到一個長方形)和實際結果(你看不到一個矩形)。 –

+0

你真棒! – user3798851

回答

1

您需要致電repaint()您的JFrame

button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
       drawrectangle rec= new drawrectangle(); 
       panel.add(rec); 
       rec.paintComponent(); 
       frame.repaint(); 
     } 
}); 
+0

何處和爲什麼? – user3798851

+0

其中:請參閱我的編輯。爲什麼?因爲在任何組件上調用repaint()都會向repaint管理器添加一個請求來繪製該組件。 – ltalhouarne

+1

@ user3798851哇,冷靜下來。 –

0

簡單地寫:

frame.validate(); 
frame.repaint(); 
+0

不工作! .. – user3798851

+0

由於其長度較短,您的答案顯示在質量較低的帖子審閱隊列中。請考慮擴展您的答案,以指明您在哪裏添加您提及的代碼,以及爲什麼它可以解決OP的問題。 – azurefrog

+0

@azurefrog它不會,因爲它與問題的原因無關。 –

0

你的組件沒有大小。您需要覆蓋getPreferredSize()並返回矩形的大小,否則您需要通過調用setSize()來在其構造函數中設置其大小。矩形未出現的原因是因爲它正在繪製區域之外,而Java 2D圖形會剪切您在組件外繪製的部分(即全部)。

並非如此,您需要撥打repaint()validate(),因爲當您將矩形添加到面板時,它會自動重新放置並將其自身標記爲需要重繪。

但是,要知道,你每次添加一個新的矩形的事件觸發。那是你要的嗎?此外,rectangledrawrectangle應該大寫字母開頭,以符合標準的Java命名約定,雖然也有java.awt.Rectangle類,所以Rectangle可能不使用最好的名字。

+0

讓我試試:) – user3798851

+1

它的工作,謝謝:),你可以告訴我使用pack()方法?? – user3798851

+0

[Java教程](http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html)以這種方式描述它:「pack方法調整框架的大小,使其所有內容都處於或高於他們的首選尺寸。「 [pack javadoc](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack())說:「導致此窗口的大小適合首選大小和其子組件的佈局。「 –

0

只需將window.visibility添加到true即可。