2017-02-27 84 views
-1

我試圖瞭解一個油漆圖形,但我的橢圓形不能繪製。有人可以告訴我我做錯了什麼,橢圓形不是繪圖嗎? 我在哪裏犯了一個錯誤?爲什麼橢圓不能繪製?

主要類:

import java.awt.EventQueue; 
public class Main { 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      Frame frame = new Frame(); 

     } 
    }); 
} 

Frame類:

public class Frame extends JFrame { 
private static final long serialVersionUID = 1L; 

public static Grafika grafika; 

public Frame() { 
    JFrame frame = new JFrame("Title"); 
    grafika = new Grafika(); 

    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setLayout(null); 
    // frame.addKeyListener(this); 
    frame.add(grafika); 
} 
} 

而在去年GRAFIC類:

public class Grafika extends JComponent { 

int x = 200; 
int y = 200; 

public void paint(Graphics g) { 

    Graphics2D oval = (Graphics2D) g; 
    oval.setColor(Color.BLACK); 
    oval.fillOval(x, y, 100, 100); 
    oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON); 

} 
} 
+0

如果您的框架類擴展了JFrame,爲什麼要在框架構造函數中創建一個新的JFrame?你已經是一個JFrame。 – FredK

回答

3

幾個問題,但最大的是,您使用的是空在您的JFrame上進行佈局,然後添加首選大小和大小均爲0,0的JComponent。所以,當你將你的Grafika添加到JFrame中時,它沒有被顯示的機會。

建議:

  • 切勿使用null佈局,除在非常特殊的情況除外。
  • 給你Grafika分量的首選大小,最好通過重寫getPreferredSize(),但在這個階段,我認爲這將是確定調用setPreferredSize(...)就可以了。
  • 將它添加到JFrame,pack() JFrame中,然後最後,只有在所有組件都被添加到JFrame,使其可見。

而且

  • 你應該是壓倒一切的paintComponent不畫
  • 你應該打電話給你的覆蓋範圍內的超級畫法。
  • 始終使用@Override註釋,當你認爲你要覆蓋父方法。你可能是錯的,你希望編譯器告訴你。
  • 設置渲染提示之前圖紙。否則提示將不會對繪圖產生影響。
  • 避免給你的類名稱與核心Java類名稱衝突,如Frame。這可能會混淆他人和你未來的自我。

例如,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.*; 

public class MyGrafika extends JComponent { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    private static final Color OVAL_COLOR = Color.RED; 
    private int ovalX = 200; 
    private int ovalY = 200; 
    private int ovalWidth = 100; 
    private int ovalHeight = 100; 

    public MyGrafika() { 
     setPreferredSize(new Dimension(PREF_W, PREF_H)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(OVAL_COLOR); 
     g2.fillOval(ovalX, ovalY, ovalWidth, ovalHeight); 
    } 

    private static void createAndShowGui() { 
     MyGrafika mainPanel = new MyGrafika(); 

     JFrame frame = new JFrame("MyGrafika"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
2

由於您使用Swing你應該重寫paintComponent而不是paint,你也應該使用空佈局照顧。但問題是,你應該做的框架可見以前將Grafika組件:

frame.add(grafika); 
frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 

如果你真的需要添加組件的框架已經取得了明顯的後,那麼你應該調用重新驗證+重繪上框架或包含附加組件的面板:

frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 
frame.add(grafika); 
frame.validate(); 
frame.repaint();