import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;public class CutLine {
public static void main(String[] args) {
EventQueue.invokeLater(new  Runnable() {
public void run() {
CutFrame frame = new CutFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
}
});
}
}class CutFrame extends JFrame {
public CutFrame () {
this.setBounds(100,100,1020,540);
this.setName("直线段的裁剪");
CutPanel panel = new CutPanel();
add(panel);
this.setVisible(true);
}
}class CutPanel extends JPanel {
int startX,startY,endX,endY,rectStartX,rectStartY,rectEndX,rectEndY;
private JButton display1,display2,display3,display4,display6,display7,display8,display9;
boolean flag = true;
int num = 1;
public CutPanel() {
setLayout(new BorderLayout());
this.setLayout(new GridLayout(1,2));
JPanel rightpanel =new JPanel();
rightpanel.setLayout(new GridLayout(2,1));
ShowPanel showpanel =new ShowPanel();
CreateFormPanel cpanel = new CreateFormPanel();
ButtonPanel buttonpanel = new ButtonPanel(); 
add(cpanel);
add(rightpanel);
rightpanel.add(showpanel);
rightpanel.add(buttonpanel);

}
class CreateFormPanel extends JPanel {
public CreateFormPanel() {
this.setBackground(Color.GRAY);
creatRect();

}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for(int i=0 ; i<=500 ; i += 20) {
g.drawLine(i, 0, i, 500);
}
for(int j = 0 ; j<= 500 ; j += 20 ) {
g.drawLine(0, j, 500, j);
}

g.setColor(Color.RED);
g.drawRect(rectStartX,rectStartY, rectEndX-rectStartX, rectEndY-rectStartY);

}

public void creatRect() {
this.addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent me) {
if(flag) {
rectStartX = adjust(me.getX());
rectStartY = adjust(me.getY());
}
else {
startX = me.getX();
startY = me.getY();
}
}
public void mouseReleased(MouseEvent org0) {
//if(startX <= 500&&startY <= 500&&endX <= 500&&endY <= 500) { 
repaint();
//}
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent me1) {
/* //if(me1.getX() <= 500&&me1.getY() <= 500) {
String x = " " + (float)me1.getX()/20;
display1.setText(x);
    String y = " " + (float)me1.getY()/20;
    display2.setText(y);
//}
*/ }
public void mouseDragged(MouseEvent me) {
if(flag) {
rectEndX = adjust(me.getX());
rectEndY = adjust(me.getY());
}
else {
endX = me.getX();
endY = me.getY();
}
repaint();
}
});
}
public void paint(Graphics g) {
    super.paint(g);
    if(flag == false) {
g.setColor(Color.WHITE);
//g.drawLine(startX, startY, endX, endY);
Sutherland_Cohen(g , startX,startY,endX,endY);
}   
}
}
class ShowPanel extends JPanel {
public ShowPanel() {
this.setLayout(new GridLayout(8,2));
display1 = new JButton("0 ");
makeDisplay("鼠标当前坐标X:",display1,this);
display2 = new JButton("0 ");
makeDisplay("鼠标当前坐标Y:",display2,this);
display8 = new JButton("0 ");
makeDisplay("生成园圆心的坐标X::",display8,this);
display9 = new JButton("0 ");
makeDisplay("生成园圆心的坐标Y:",display9,this);
display6 = new JButton("0 ");
makeDisplay("下一点生成方式:",display6,this);
display7 = new JButton("0 ");
makeDisplay("当前d(f)值为:",display7,this);
display3 = new JButton("0 ");
makeDisplay("当前生成点坐标X:",display3,this);
display4 = new JButton("0 ");
makeDisplay("当前生成点坐标Y:",display4,this);
}
public void makeDisplay(String name,JButton display,JPanel jpanel) {
display.setEnabled(false);
jpanel.add(new JLabel(name,SwingConstants.LEFT));
jpanel.add(display);
}
}
class ButtonPanel extends JPanel {
public ButtonPanel() {
addButton("下一步");
addButton("清除");
addButton("矩形");
} public void addButton(String name) {
final JButton button = new JButton(name);
this.add(button);
ActionListener listener = new ActionListener(){ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand() == "矩形") {
flag = false;
button.setText("直线");
}
if(e.getActionCommand() == "直线") {
flag = true;
button.setText("矩形");
}
if(e.getActionCommand() == "下一步") {
num++;
repaint();
}
if(e.getActionCommand() == "清除") {
num = 1;
repaint();
}
}

};
button.addActionListener(listener); }
}
public void paint(Graphics g) {
    super.paint(g);
    if(flag == false) {
g.setColor(Color.WHITE);
//g.drawLine(startX, startY, endX, endY);
Sutherland_Cohen(g , startX,startY,endX,endY);
}   
}
public  int adjust(int num) {
int temp =(int) num/20;
if(num%20 >= 10) {temp = temp + 1;}
return 20*temp;
}
public int code (int x,int y) {
int c = 0;
if(x < rectStartX) {c = c|1;}
else if(x > rectEndX){c = c|2;}
if(y < rectStartY) {c = c|4;}
else if(y > rectEndY) {c = c|8;}
return c;
}
public void Sutherland_Cohen(Graphics g,int x0,int y0,int x2,int y2) {
int c1,c2,c;
float x,y,wx,wy;
//boolean accept = false;
boolean done = false;
c1 = code(x0,y0);
c2 = code(x2,y2);
if(!done) {
//do {
for(int i = 1;i <= num ;i++) {
System.out.print(num);
g.setColor(Color.BLUE);
g.drawLine(x0,y0,x2,y2);
if((c1|c2) == 0) {
//accept = true;
done = true;
}
else if((c1&c2) != 0) {done = true;}
 else {
 c = c1;
 if(c == 0) {c = c2;}
 wx = x2 - x0;
 wy = y2 - y0;
 if((c&8) == 8) {
 x = x0 + wx*(rectEndY - y0)/wy;
 y = rectEndY;
 }
 else if((c&4) == 4) {
 x = x0 + wx*(rectStartY - y0)/wy;
 y = rectStartY;
 }
 else if((c&1) == 1) {
 y = y0 + wy*(rectStartX - x0)/wx;
 x = rectStartX;
 }
 else {
 y = y0 + wy*(rectEndX - x0)/wx;
 x = rectEndX;
 }
 
 
 if(c == c1) {
 x0 = (int)x;
 y0 = (int)y;
 c1 = code(x0,y0);
 }
 else {
 x2 = (int)x;
 y2 = (int)y;
 c2 = code(x2,y2);
 }
 }
//}while(done == false);
//if(accept) { //}
}
}
}
}
这个是图形学裁剪直线的实验。为什么运行后,按下一步没反应,然后最小化在恢复就又有反应了...刚学java,代码都比较乱,请体谅啊...