2012-12-04 43 views
1

如何讓paintComponent在我的drawArea JPanel中工作?此外,我嘗試設置drawArea的尺寸失敗。運行後不會出現圖形,並且JPanel尺寸最小。這是否與MigLayout有關?將JPanel和paintComponent連接在一起

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import net.miginfocom.layout.*; 
import net.miginfocom.swing.MigLayout; 
import java.awt.geom.*; 

public class OvalDrawer extends JApplet 
{ 
private JLabel numberL; 
private JTextField numberTF; 

private NumHandler numHandler; 

public static final int WIDTH = 500; 
public static final int HEIGHT = 500; 

public int number; 

//Create Layout 
public void init() 
{ 
    setLayout(new MigLayout("wrap 2")); 
    numberL = new JLabel("Enter number of ovals to draw:"); 
    numberTF = new JTextField(7); 

    add(numberL); 
    add(numberTF); 

    numHandler = new NumHandler(); 
    numberTF.addActionListener(numHandler); 

    JPanel drawArea = new JPanel(); 
    drawArea.setSize(400, 400); 
    drawArea.setBorder(BorderFactory.createTitledBorder("Draw Area")); 
    add(drawArea, "span 2"); 

    setSize(WIDTH, HEIGHT); 
} 

//Event Handler 
public class NumHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     number = Integer.parseInt(numberTF.getText()); 
     repaint(); 
    } 

} 

//Draw Ovals 
public void paintComponent (Graphics g) 
{ 
    super.paintComponents(g); 
    int x = 10; 
    int y = 10; 
    int width = 200; 
    int height = 100; 

    for (int i = 0; i < number; i++) 
    { 
     g.drawOval(x, y, width, height); 

     x += 5; 
     y += 5; 
     width += 5; 
     height += 5; 
    } 
} 
} 

回答

2

JApplet中沒有paintComponent方法。

您應該避免直接在頂層容器上繪畫,如JApplet,它更像是一個單層容器。

取而代之,創建第二個類,從JPanel延伸並在那裏執行自定義繪畫。

修訂

你也應該避免使用setPreferred/Minimum/MaximumSize,這是容易爲另外一個人來規避。

public class OvalDrawer extends JApplet { 

    private JLabel numberL; 
    private JTextField numberTF; 
    private NumHandler numHandler; 
    public static final int WIDTH = 500; 
    public static final int HEIGHT = 500; 
    public int number; 

    //Create Layout 
    public void init() { 
//  setLayout(new MigLayout("wrap 2")); 
     setLayout(new BorderLayout()); 
     numberL = new JLabel("Enter number of ovals to draw:"); 
     numberTF = new JTextField(7); 

     JPanel header = new JPanel(); 
     header.add(numberL); 
     header.add(numberTF); 

     add(header, BorderLayout.NORTH); 
     add(new PaintPane()); 

     numHandler = new NumHandler(); 
     numberTF.addActionListener(numHandler); 

//  JPanel drawArea = new JPanel(); 
//  drawArea.setSize(400, 400); 
//  drawArea.setBorder(BorderFactory.createTitledBorder("Draw Area")); 
//  add(drawArea, "span 2"); 

     setSize(WIDTH, HEIGHT); 
    } 

    //Event Handler 
    public class NumHandler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      number = Integer.parseInt(numberTF.getText()); 
      repaint(); 
     } 
    } 

    //Draw Ovals 
    public class PaintPane extends JPanel { 

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

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int x = 10; 
      int y = 10; 
      int width = 200; 
      int height = 100; 

      for (int i = 0; i < number; i++) { 
       g.drawOval(x, y, width, height); 

       x += 5; 
       y += 5; 
       width += 5; 
       height += 5; 
      } 
     } 
    } 
} 
+0

哇,直到現在還沒有意識到paintComponent和JPanel的關係。非常感謝。 –

+0

對於OP來說是個不錯的例子 –