2014-01-23 95 views
0

誰能告訴我爲什麼矩形不顯示在框架上?JFrame和矩形

我只在框架上看到一個按鈕。請幫忙。

我試圖用paint方法繪製矩形。

我應該用paintComponent()還是paint()

public class GUI2 { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Game"); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 
     frame.setLocation(500, 200); 
     JPanel panel = new JPanel(); 
     frame.add(panel); 
     JButton button = new JButton("YO"); 
     panel.add(button); 
     button.addActionListener(new Action()); 
     frame.paint(null); 
    } 

    public void paint(Graphics g) { 
     g.drawRect(250, 250, 200, 100); 
    } 

    static class Action implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 

     } 
    } 
} 

回答

4
  1. 你不應該有顯式調用paint
  2. 擺脫paint方法
  3. 的做一個內部JPanel
  4. 是在paintComponent方法JPanel
  5. 呼叫super.paintComponent覆蓋paintComponent
  6. JPanel添加到JFrame
  7. 不做main裏面的一切,因爲你會發現,這static會造成你的問題。做構造函數中的所有內容
  8. 運行EDT SwingUtilitites.invokeLater()中的程序。
  9. 使按鈕成爲一個全局變量,所以它可以從ActionListener
  10. setVisible訪問應該是你添加所有組件後最後做的事情。
  11. 加入多個組件JFrame你將要使用的BorderLayout位置,或在您的JPanel繪製時的佈局設置爲JFrame到別的東西,除了BorderLayout
  12. 覆蓋getPrefferedSize,所以JPanel有一個受人尊敬的首選大小。
  13. 不要設置JFrame的大小隻是調用pack();

這裏是你的代碼的重構

另見Creating GUI with Swing | Graphics2D | Performing Custom Paintin瞭解更多詳情。

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

public class GUI2 { 

    JButton button = new JButton("YO"); 

    public GUI2() { 
     button.addActionListener(new Action()); 
     JFrame frame = new JFrame("Game"); 
     frame.add(new DrawPanel(), BorderLayout.CENTER); 
     frame.add(button, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private class DrawPanel extends JPanel { 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawRect(250, 250, 200, 100); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new GUI2(); 
      } 
     }); 
    } 

    static class Action implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 

     } 
    } 
} 
+0

將OP指向一兩個教程並贏得巨型泰迪熊;) – MadProgrammer

+0

@MadProgrammer這些任務的重複性讓我變得懶惰。感謝泰迪保持我的動力:) –

+0

爲什麼你認爲我的答案是如此「短」... – MadProgrammer

2

我可以告訴你爲什麼,你會得到一個NullPointerException

  1. 你沒有覆蓋
  2. 你沒有通過有效的Graphics方面給您的任何顯示組件的任何paint方法paint方法,但我會勸阻任何方式
  3. 你應該使用@Override註釋,這將阻止類編譯。使用它時,你認爲你覆蓋父類的方法,它會告訴你,當你錯了

開始採取看看Performing Custom Painting再看看Painting in AWT and Swing有關如何更多詳情畫是在Swing

0

這裏實際上做的是工作示例代碼的:

package test; 

import javax.*; 
import javax.swing.*; 

import java.awt.event.*; 
import java.awt.image.ImageObserver; 
import java.awt.*; 
import java.text.AttributedCharacterIterator; 

public class GUI2 extends JPanel{ 
    JButton button; 
    JFrame frame; 

    public GUI2() { 
     button = new JButton("YO"); 
     //panel = new JPanel(); 
     frame = new JFrame(); 
     //panel = new JPanel(); 
     this.add(button); 
     frame.add(this); 
     //button.addActionListener(new Action()); 
     // this.paint(null); 
     frame.setSize(500, 500); 
     frame.setLocation(500, 200); 
     frame.setVisible(true); 
    } 

    public void paint(Graphics g) { 
     g.setColor(Color.red); 
     g.drawRect(250, 250, 200, 100); 
    } 
public static void main(String[] args) { 

     GUI2 test = new GUI2(); 
    } 
} 

我已刪除了部分報表,但以後可以將它們添加

+0

謝謝你的一個不好的例子。由於未能調用'super.paint',你已經打斷了paint鏈,不推薦重寫'paint'任何東西,你沒有考慮[初始線程](http://docs.oracle.com/javase /tutorial/uiswing/concurrency/initial.html),我會勸阻任何人在最好的時候從組件內部初始化框架。恕我直言,將一堆代碼放在缺乏經驗或理解的人身上並不是教導他們的好方法。他們不知道「爲什麼」你選擇做你做過的事情 – MadProgrammer

+0

好吧,我的錯誤我也是這個網站的新手..我只是想幫他 – Nullpointer

+1

想要幫忙的豎起大拇指,沒有問題,但例子會給OP帶來更多問題然後解決(恕我直言) – MadProgrammer