本人菜鸟,最近要做作业,写一个类类似绘图的程序,我想用单选按钮来决定画自由线条、直线,圆,矩形等
以下是代码的一部分
public J_Draw()
{
super("a");
final Container c = getContentPane();
c.setLayout(new FlowLayout());
//c.add(new J_Panel_Free(),BorderLayout.CENTER);

JRadioButton[] r = {new JRadioButton("自由线条"),new JRadioButton("直线"),new JRadioButton("矩形"),new JRadioButton("椭圆")};
ButtonGroup rg = new ButtonGroup();
for(int i = 0;i < r.length;i++)
{
c.add(r[i]);
rg.add(r[i]);
r[0].setSelected(true);
r[1].setSelected(false);
r[2].setSelected(false);
r[3].setSelected(false);
}


r[0].addItemListener(new ItemListener() 
{
public void itemStateChanged(ItemEvent a) 
    {
J_Panel_Free f = (J_Panel_Free)a.getSource();
             c.add(new J_Panel_Free(),BorderLayout.CENTER);
             //……
            }
        });

}

//public J_ActionListener implements ActionListener

public static void main(String args[])
{
J_Draw app = new J_Draw();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(600,550);
app.setVisible(true);
}
}
J_Panel_Free()是画自由线条的类,但运行后没有画图的面板,请高手赐教

解决方案 »

  1.   


    public void itemStateChanged(ItemEvent a)
        {
    J_Panel_Free f = (J_Panel_Free)a.getSource();
                c.add(new J_Panel_Free(),BorderLayout.CENTER);
                //……
                //主要是下面的,加上就行了:
                c.validate();
                }
            });} 
      

  2.   

    闲的无聊,按照你的作业要求写了个程序,发给你看看,
    和你的实现思路有点点不同:import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Line2D;
    import java.awt.geom.Path2D;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    //这就是一个窗口
    public class Paint extends JFrame{

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

    private Canvas canvas = null; public Paint() {
    canvas = new Canvas(null);
    getContentPane().add( canvas, BorderLayout.CENTER );
    JPanel p = new JPanel();
    final JRadioButton[] r = {new JRadioButton("自由线条"),new JRadioButton("直线"),new JRadioButton("矩形"),new JRadioButton("椭圆")};
    ButtonGroup rg = new ButtonGroup();
    ItemListener il = new ItemListener() {
    public void itemStateChanged( ItemEvent e ) {
    if( e.getStateChange() == ItemEvent.SELECTED ) {
    for( int i = 0;i< r.length; i++) {
    if( e.getSource() == r[i]) {
    canvas.setPaintMode( i );
    }
    }
    }
    }
    };
    for(int i = 0;i < r.length;i++){
    p.add(r[i]);
    rg.add(r[i]);
    r[i].setSelected( i == 0 );
    r[i].addItemListener( il );
    }
    getContentPane().add( p , BorderLayout.NORTH );
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    setSize(500,600);
    setLocationRelativeTo( null );
    setVisible(true);
    }
    }//这个类充当了一个画板的角色
    class Canvas extends JPanel{
    //定义几种类型图像的常量
    public static final int PAINT_FREE = 0;
    public static final int PAINT_LINE = 1;
    public static final int PAINT_RECT = 2;
    public static final int PAINT_ELLI = 3;

    //图像会话模式
    private int paintMode = 0;

    public int getPaintMode() {
    return paintMode;
    }
    public void setPaintMode( int paintMode ) {
    if( paintMode < 0 || paintMode > 3) {
    throw new IllegalArgumentException("the arg not int bound");
    }
    this.paintMode = paintMode;
    } private List<Shape> shapes = new ArrayList<Shape>();
    private Image background = null;

    private Shape tmp = null;

    public Canvas (Image background) {
    this.background = background;
    AmouseListener al = new AmouseListener();
    this.addMouseListener( al );
    this.addMouseMotionListener( al );
    }

    //所有的作画操作在这里
    protected void paintComponent( Graphics g ) {
    super.paintComponent( g );
    g.setColor( Color.WHITE );
    if( background != null ) {
    int iWidth = background.getWidth( this );
    int iHeight = background.getHeight( this ); 
    g.drawImage( background, 0, 0, iWidth, iHeight, this );
    }else {
    g.fillRect( 0, 0, this.getWidth(), this.getHeight() );
    }
    g.setColor( Color.RED );
    Graphics2D g2 = (Graphics2D)g;
    for(int i=0;i<shapes.size();i++) {
    g2.draw( shapes.get( i ) );
    }

    if( tmp != null ) {
    g2.setColor( Color.BLUE );
    g2.draw( tmp );
    tmp = null;
    }
    }

    //监听鼠标事件的监听器
    class AmouseListener extends  MouseAdapter{
    private Point start = null;
    private Path2D free = null;

    public void mousePressed( MouseEvent e ) {
    if( paintMode == PAINT_FREE ) {
    free = new Path2D.Float();
    free.moveTo( e.getX(), e.getY() );
    }else {
    start = e.getPoint();
    }
    } public void mouseReleased( MouseEvent e ) {
    shapes.add( caluShape( e ) );
    Canvas.this.repaint();
    }

    private Rectangle getRect(Point p1, Point p2) {
    int x1 = (int) p1.getX();
    int y1 = (int) p1.getY();
    int x2 = (int) p2.getX();
    int y2 = (int) p2.getY();
    int x = Math.min( x1, x2 );
    int y = Math.min( y1, y2 );
    int w = Math.abs( x1 - x2 );
    int h = Math.abs( y1 - y2 );
    Rectangle rt = new Rectangle(x,y,w,h);
    return rt;
    } public void mouseDragged( MouseEvent e ) {
    Canvas.this.tmp = caluShape( e );
    Canvas.this.repaint();
    }

    private Shape caluShape( MouseEvent e ) {
    Shape s = null;
    switch( paintMode ) {
    case PAINT_FREE :
    free.lineTo( e.getX(), e.getY() );
    s = free;
    break;
    case PAINT_LINE :
    s = new Line2D.Float(start, e.getPoint());
    break;
    case PAINT_RECT :
    s = getRect( start, e.getPoint() );
    break;
    case PAINT_ELLI :
    Rectangle rt = getRect( start, e.getPoint() );
    s = new Ellipse2D.Float(rt.x, rt.y, rt.width, rt.height);
    break;
    default :
    return null;
    }
    return s;
    }
    }
    }