JAVA简单画图板的实现

Java中边框布局:
1.把窗口分成5个区域:北、南、东、西、中 每个区域最多只能可以包含一个组件 (如果想把窗口分的更多 可以再其中一个区域上添加面板 面板上再添加组件)
2.NORTH 和 SOUTH 组件可以在水平方向上拉伸;而 EAST 和 WEST 组件可以在垂直方向上拉伸;CENTER 组件可同时在水平和垂直方向上拉伸,从而填充所有剩余空间。(例子中的panelcenter的大小没有意义,panelleft的height和panelbottom的width没有意义)

Java中单选按钮:
1.通过ButtonGroup对象 给多个单选按钮进行逻辑分组
2.当多个JRadioButton共用一个事件监听器的时候,如何获取产生事件的按钮?(Java中获得
ButtonGroup选项的方法)
a.在画图板主类中每个单选按钮对象调用setActionCommand();方法 设置唯一的动作命令
eg:JRadioButton btn1 = new JRadioButton("直线");
btn1.setActionCommand("line");//设置唯一标识
b.按钮组对象调用getSelection();方法 获得被选中的按钮模型
eg:ButtonGroup group = new ButtonGroup();
ButtonModel model = group.getSelection();
c.ButtonMode对象调用getActionCommand();获得动作命令
eg:String str = model.getActionCommand();
d.通过str的值来进行区分鼠标选中的是哪个按钮
(步骤2和3可以合并 String str=group.getSelection().getActionComman();)
方法说明:
void setActionCommand(String s)//设置按钮及其模型的动作命令
ButtonModel getSelection() //返回被选择的按钮的按钮模型
String getActionCommand() //返回该按钮的动作命令字符串

Java中不同类里共享私有变量可以通过构造方法来实现

新手一只,请多指教! :D :D
DrawUI
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class DrawUI {
public static void main(String[] args) {
JFrame jf=new JFrame();
jf.setSize(600, 500);
jf.setTitle("画图板");
jf.setDefaultCloseOperation(3);

//指定窗口布局为边框布局
BorderLayout layout=new BorderLayout();
jf.setLayout(layout);

//添加一个用来绘图的面板
JPanel panelleft=new JPanel();
panelleft.setBackground(Color.blue);
//设置大小
Dimension dimleft=new Dimension(100,1);
panelleft.setPreferredSize(dimleft);

JPanel panelcenter=new JPanel();
panelcenter.setBackground(Color.gray);
//中间组件大小没有意义
// Dimension dimcenter=new Dimension(1,1);
// panelcenter.setPreferredSize(dimcenter);

JPanel panelbottom=new JPanel();
panelbottom.setBackground(Color.green);
Dimension dimbottom=new Dimension(1,100);
panelbottom.setPreferredSize(dimbottom);

//把面板添加到窗口中,指定放的位置【东西南北中】
jf.add(panelleft,BorderLayout.WEST);
jf.add(panelcenter,BorderLayout.CENTER);
jf.add(panelbottom,BorderLayout.SOUTH);

//*********************给左边的面板添加形状选择工具***********************//
//按钮组对象,给单选按钮进行逻辑分组
ButtonGroup group =new ButtonGroup();

JRadioButton button1=new JRadioButton("直线");
panelleft.add(button1);//加在左边面板上
group.add(button1);//添加分组
button1.setActionCommand("line");//设置唯一标识
button1.setSelected(true);//设置默认选中 避免出现空指针的错误

JRadioButton button2=new JRadioButton("矩形");
panelleft.add(button2);
group.add(button2);
button2.setActionCommand("rect");

JRadioButton button3=new JRadioButton("椭圆");
panelleft.add(button3);
group.add(button3);
button3.setActionCommand("oval");

//*****************给中间的面板添加绘图面板***************************//

JPanel drawpanel=new JPanel();
Dimension drawdim=new Dimension(400,300);
drawpanel.setPreferredSize(drawdim);
drawpanel.setBackground(Color.white);

//流式布局是添加在中间面板上的
//面板默认的布局为流式布局
//指定中间面板的布局为流式布局左对齐
FlowLayout drawlayout =new FlowLayout(FlowLayout.LEFT);
panelcenter.setLayout(drawlayout);
panelcenter.add(drawpanel);
//********************给底部的面板添加颜色选择工具***********************//

jf.setVisible(true);

//由于是绘制在drawpanel上的,所以只需要给drawpanel添加鼠标监听器
DrawListener listener=new DrawListener(drawpanel, group);
//给面板添加鼠标监听器
drawpanel.addMouseListener(listener);

}
}
DrawListener

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JPanel;

public class DrawListener implements MouseListener {
private int x1,x2,y1,y2;
private Graphics g;
private JPanel drawpanel;
private ButtonGroup group;
private String str="line";//初始化避免出现空指针的错误

//通过构造方法实现不同类中私有变量的共享
public DrawListener(JPanel drawpanel1,ButtonGroup group1){
drawpanel=drawpanel1;
group=group1;
}

public void mousePressed(MouseEvent e) {
// 鼠标按下准备绘制图形的时候先获取能绘制的区域[画布]
// 获取drawPanel在屏幕上占据的区域,作为可以改变颜色的区域
g=drawpanel.getGraphics();

// 鼠标按下准备绘制的时候来确定要绘制的图形
// 获得被选中的按钮模型
ButtonModel model=group.getSelection();

// 获得动作命令[每一个按钮的唯一标识]
str=model.getActionCommand();
// str=group.getSelection().getActionCommand();
x1=e.getX();
y1=e.getY();
}
public void mouseReleased(MouseEvent e) {
x2=e.getX();
y2=e.getY();

// 绘制图形
if(str.equals("line")){
g.drawLine(x1, y1, x2, y2);
}
else if(str.equals("rect")){
int x=x1<x2?x1:x2;
int y=y1<y2?y1:y2;
int width=x1<x2?x2-x1:x1-x2;
int height=y1<y2?y2-y1:y1-y2;
g.drawRect(x, y, width, height);
}
else if(str.equals("oval")){
int x=x1<x2?x1:x2;
int y=y1<y2?y1:y2;
int width=x1<x2?x2-x1:x1-x2;
int height=y1<y2?y2-y1:y1-y2;
g.drawOval(x, y, width, height);
}

}

public void mouseClicked(MouseEvent e) {

}
public void mouseEntered(MouseEvent e) {

}
public void mouseExited(MouseEvent e) {

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值