2012-10-15 152 views
4

我對Java和Swing相當陌生,這也是我的第一篇文章,如果沒有太多意義,那麼很抱歉。JPanel不會正確繪製

我想要做的是當我點擊一個JPanel,我想要它添加一個圓,我點擊。目前,所有似乎發生的事情是當我點擊時,在我想添加的JPanel內出現一個小的灰色方塊,但我似乎無法找到任何將它繪製爲圓的方法。

我有一個擴展名爲「Ball」的JPanel的類,它是我單擊時添加的內容。 目前,我並不太擔心它是否在正確的位置,只是爲了正確地畫出球。 下面是我的「球」類的代碼:

package paintsliders; 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

class Ball extends JPanel{ 

private int x,y,w,h; 

//I will use this constructor to put the ball in the correct location later. 
Ball(){ 
    /*this.w = 100; 
    this.h = 100; 
    this.x = 200; 
    this.y = 200;*/ 
} 

//draw the ball 
    @Override 
public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(200,200,10,10); 
     g.setColor(Color.RED); 
    } 

} 

我可以種猜想,這是值得做的的paintComponent方法,但是我到處都看似乎並沒有對我有一個解決方案。

任何幫助將是偉大的,謝謝!

+0

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 –

回答

4

您可能有一個主要的JPanel點擊。

我寧願設計主面板處理鼠標點擊和Ball類是一個簡單的Object定義一個drawBall(Graphics g, int x, int y)方法,知道如何畫一個Ball。這將在主面板中由paintComponent()方法調用。在主面板中,處理鼠標單擊,創建Ball類型的對象並致電repaint()。在paintComponent()內部,您可以撥打ball.drawBall()

5

Graphcis方面已經被翻譯,以滿足組件應該出現在它的父容器中的X/Y位置,這意味着頂部,paintComponent方法中的Graphics背景的左上角實際上爲0x0。

您需要定義一些大小的球,你在10×10畫,這將表明你的球組件應返回的10×10

public Dimension getPreferredSize() { 
    return new Dimension(10, 10); 
} 

一個preferredSize您將負責提供適當的佈局細節當它添加到父容器中的球...

public void mouseClicked(MouseEvent evt) { 
    Point p = evt.getPoint(); 
    Ball ball = new Ball(); 
    Dimension size = ball.getPreferredSize(); 
    ball.setBounds(new Rectangle(p, size)); 
    add(ball); 
} 

這當然,假設你有父容器null佈局集

修訂

喜歡的東西...

See spot run

public class PaintBalls { 

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

    public PaintBalls() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new Board()); 
       frame.setSize(200, 200); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Board extends JPanel { 

     public Board() { 
      setLayout(null); 
      setBackground(Color.WHITE); 
      addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        Point p = e.getPoint(); 
        Ball ball = new Ball(); 
        Dimension size = ball.getPreferredSize(); 
        p.x -= size.width/2; 
        p.y -= size.height/2; 

        ball.setBounds(new Rectangle(p, size)); 
        add(ball); 
        repaint(); 
       } 

      }); 
     } 

    } 

    public class Ball extends JPanel { 

     public Ball() { 
      setOpaque(false); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      g2d.fillOval(0, 0, 10, 10); 
      g2d.dispose(); 
     } 
    } 
} 
+0

所以我已經實現了這一點,現在它繪製了我點擊的對象,但是如何讓它畫出一個圓而不是矩形?很抱歉,如果這真的很基本,但我真的是新的。 – Stefoth

+0

嘗試將'Ball'設置爲透明('setOpaque(false)') – MadProgrammer

+0

用示例更新 – MadProgrammer