本人菜鸟,最近要做作业,写一个类类似绘图的程序,我想用单选按钮来决定画自由线条、直线,圆,矩形等
以下是代码的一部分
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()是画自由线条的类,但运行后没有画图的面板,请高手赐教
以下是代码的一部分
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()是画自由线条的类,但运行后没有画图的面板,请高手赐教
public void itemStateChanged(ItemEvent a)
{
J_Panel_Free f = (J_Panel_Free)a.getSource();
c.add(new J_Panel_Free(),BorderLayout.CENTER);
//……
//主要是下面的,加上就行了:
c.validate();
}
});}
和你的实现思路有点点不同: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;
}
}
}