📄 drawfigure.java
字号:
package DrawFigure;
import java.awt.*;
import java.awt.event.*;
//import java.awt.event.MouseMotionListener;
import javax.swing.*;
import java.util.*;
public class DrawFigure extends JFrame implements MouseListener,MouseMotionListener,
AdjustmentListener,ItemListener{
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel top = new JPanel();
JPanel bottom = new JPanel();
ButtonGroup g = new ButtonGroup(); //此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。
JRadioButton op1 = new JRadioButton("画",true); //实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。
JRadioButton op2 = new JRadioButton("直线",false);
JRadioButton op3 = new JRadioButton("园",false);
JRadioButton op4 = new JRadioButton("矩形",false);
JCheckBox c1 = new JCheckBox("填充"); //复选框的实现,复选框是一个可以被选定和取消选定的项,它将其状态显示给用户。
Color c = Color.black;
JTextArea tt = new JTextArea(2,3);
int f = 1;
int x1,y1;
int sx,sy,x,y;
boolean fill = false;
boolean flag = false;
boolean hua = false;
JScrollBar r1 = new JScrollBar(JScrollBar.HORIZONTAL,0,4,0,255);
JScrollBar g1 = new JScrollBar(JScrollBar.HORIZONTAL,0,4,0,255);
JScrollBar b1 = new JScrollBar(JScrollBar.HORIZONTAL,0,4,0,255);
public DrawFigure(){
getContentPane().setLayout(new BorderLayout());
top.setOpaque(true);
top.setBackground(Color.white);
tt.setBackground(Color.black);
p1.setLayout(new FlowLayout());
p1.setBackground(Color.LIGHT_GRAY);
p2.setLayout(new GridLayout(3,1));
p2.setPreferredSize(new Dimension(150,50));
p2.add(r1);p2.add(g1);p2.add(b1);
tt.setEditable(false);
g.add(op1);g.add(op2);g.add(op3);g.add(op4); //将四个单选框加进buttongroup 来确保单选
p1.add(op1);p1.add(op2);p1.add(op3);p1.add(op4); //将四个单选按钮加到JPanel中
p1.add(c1);p1.add(tt);
bottom.add(p1);bottom.add(p2);
c1.addItemListener(this); //将一个 ItemListener 添加到 checkbox 中。
r1.addAdjustmentListener(this); //滚动条的实现 每当滚动条模型发生更改时,都会通知调整侦听器
g1.addAdjustmentListener(this);
b1.addAdjustmentListener(this);
op1.addItemListener(this); //将一个在抽象按纽中 ItemListener 添加到 复选或单选 中。
op2.addItemListener(this);
op3.addItemListener(this);
op4.addItemListener(this);
top.addMouseListener(this); //添加指定的鼠标侦听器,以接收发自此组件的鼠标事件
top.addMouseMotionListener(this); //添加指定的鼠标移动侦听器,以接收发自此组件的鼠标移动事件。
getContentPane().add(top,"Center");
getContentPane().add(bottom,"South");
// this.
setTitle("绘图程序");
setSize(500,300);
setVisible(true);
}
public void mousePressed(MouseEvent e){
flag = false;
sx = e.getX(); sy = e.getY();
}
public void mouseReleased(MouseEvent e){
int x0,y0;
Graphics g = top.getGraphics();
switch(f){
case 2:
// g.setXORMode(Color.white);
//g.drawLine(sx, sy, x, y);
x = e.getX();y = e.getY();
g.setColor(c);
g.setPaintMode();
g.drawLine(sx, sy, x, y);
break;
case 3:
case 4:
g.setXORMode(Color.white);
x0 = x>sx? sx:x; y0 = y>sy?sy:y;
if(!fill){
if(f == 3)
g.drawOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.drawRect(x0, y0, Math.abs(x -sx), Math.abs(y- sy));
}
else{
if(f == 3)
g.fillOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.fillRect(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
}
g.setPaintMode();
x = e.getX(); y = e.getY();
x0 = x>sx ? sx:x; y0 = y>sy?sy:y;
g.setColor(c);
if(! fill){
if(f == 3)
g.drawOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.drawRect(x0, y0, Math.abs(x -sx), Math.abs(y- sy));
}
else{
if(f == 3)
g.fillOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.fillRect(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
}
break;
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e){
int x0,y0;
Graphics g = top.getGraphics();
switch(f){
case 1:
x = e.getX(); y = e.getY();
g.setColor(c);
g.setPaintMode();
g.drawLine(sx, sy, x, y);
sx = x; sy = y;
break;
case 2:
//自创修改函数一
/*Color d = g.getColor();
g.setColor(Color.white);
g.drawLine(sx, sy, x1, y1);
g.setColor(d);
x = e.getX(); y = e.getY();
x1 = x; y1 = y;
g.setPaintMode();
g.drawLine(sx, sy, x, y);*/
//修改函数二
if(!flag){
x = e.getX(); y = e.getY(); //最后有一点不明白:我理解的setXORMode(color)应该是把指定的color与要绘图的区域内的颜色进行异或操作。
g.setXORMode(Color.white); // 如区域内无颜色,应能绘出指定颜色的图形。
g.drawLine(sx, sy, x, y); // 如区域内已存在指定颜色,异或操作后应擦去指定颜色的图形
flag = true; // 如区域内内已存在其它颜色,应绘制出该颜色和指定颜色进行异或操作后的新颜色的图形。
} //
else{ //
g.setXORMode(Color.white); //
g.drawLine(sx, sy, x, y); //
x = e.getX(); y = e.getY(); //
g.drawLine(sx, sy, x, y); //
} //
break;
case 3:
case 4:
if(!flag){
x = e.getX(); y = e.getY();
x0 = x>sx? sx:x; y0 = y>sy?sy:y;
g.setXORMode(Color.white);
if(!fill){
if(f == 3)
g.drawOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.drawRect(x0, y0, Math.abs(x -sx), Math.abs(y- sy));
//(int x, int y, int width, int height)
//绘制指定矩形的边框。
}
else{
if(f == 3)
g.fillOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.fillRect(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
}
flag = true;
}
else{
g.setXORMode(Color.white);
x0 = x>sx? sx:x; y0 = y>sy?sy:y;
if(!fill){
if(f == 3)
g.drawOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.drawRect(x0, y0, Math.abs(x -sx), Math.abs(y- sy));
}
else{
if(f == 3)
g.fillOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.fillRect(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
}
x = e.getX(); y = e.getY();
x0 = x>sx ? sx:x; y0 = y>sy?sy:y;
if(!fill){
if(f == 3)
g.drawOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.drawRect(x0, y0, Math.abs(x -sx), Math.abs(y- sy));
}
else{
if(f == 3)
g.fillOval(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
else
g.fillRect(x0, y0, Math.abs(x - sx), Math.abs(y - sy));
}
}
break;
}
}
public void actionPerformed(ActionEvent e){
f = Integer.parseInt(e.getActionCommand());
}
public void adjustmentValueChanged(AdjustmentEvent e){
c = new Color(r1.getValue(),g1.getValue(),b1.getValue());
tt.setBackground(c);
}
public void itemStateChanged (ItemEvent e){
if(e.getItemSelectable()instanceof JCheckBox){
JCheckBox temp = (JCheckBox)e.getItemSelectable();
fill = temp.isSelected();
}
else{
JRadioButton temp = (JRadioButton)e.getItemSelectable();
if(temp == op1) f= 1;
else if(temp == op2) f= 2;
else if(temp == op3) f= 3;
else if(temp == op4) f= 4;
}
}
public static void main(String args[]){
JFrame.setDefaultLookAndFeelDecorated(true);
Font font = new Font("JFrame",Font.PLAIN,14);
DrawFigure mainFrame = new DrawFigure();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -