2012-09-20 54 views
1

我想创建4个JPanel,在每个 上绘制一个白色矩形,然后将它们放入一个大的JPanel中。大JPanel在主框架内。如何在另一个JPanel内的JPanel上绘制Graphics2D?

但是,下面的代码不起作用。请告诉我,如何解决这个问题?

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

import java.io.*; 
import java.net.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.Rectangle2D; 
import java.io.IOException; 

public class Main extends JFrame 
{ 

public void GUI() { 
    setBounds(0, 0, 480, 960); 
    addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent we){ 

      System.exit(0); 
      } 
     }); 
     setMinimumSize(new Dimension(480, 960)); 
     setResizable(false); 

     JPanel mainPanel = new JPanel(); 
     GridLayout GL = new GridLayout(4,0); 
     mainPanel.setLayout(GL); 

    JPanel panel1 = new MyCanvas(); 
    JPanel panel2 = new MyCanvas(); 
    JPanel panel3 = new MyCanvas(); 
    JPanel panel4 = new MyCanvas(); 

    mainPanel.add(panel1); 
    mainPanel.add(panel2); 
    mainPanel.add(panel3); 
    mainPanel.add(panel4); 

    add(mainPanel); 

    setVisible(true); 
} 

public static void main(String args[]) throws IOException 
{ 
    new Main().GUI(); 
} 

class MyCanvas extends JPanel { 

    public void drawCanvas(Graphics g) { 

     super.paintComponent(g); // call superclass's paintComponent 

     Graphics2D g2 = (Graphics2D) g; // cast g to Graphics2D 

     g2.setColor(Color.WHITE); 

     double x = 100; 
     double y = 100; 
     double width = x + 200; 
     double height = y + 50; 

     g2.fillRect(50, 50, 380, 200); 
    } 
    } 
} 

回答

4

这是什么应该做的?:

public void drawCanvas(Graphics g) { 
    .... 
} 

此方法重写没有的JPanel绘制方法,因此不会经常被调用时,JVM决定画你MyCanvas的JPanel。

我认为,而不是你想重写类的paintComponent(...)方法,可以很容易地完成,只需将您的方法重命名为paintComponent(...)。如果/当您这样做时,不要忘记使用@Override注释来确保您使用正确的签名覆盖该方法。您还需要将方法的访问说明符更改为protected,而不是public

接下来,您需要对正在创建的那些双重变量进行一些操作。

+0

非常感谢! –

+1

不客气! –