Java 基于单击绘制多边形
我正在尝试编写一个程序,允许用户在每次单击帧时绘制一条线来绘制多边形。第一次单击时,应绘制一个小正方形。每次单击之后,都应该从最后一行的端点到用户单击的位置绘制一条线。一旦用户在最初制作的正方形内单击,多边形将完成,正方形将消失。我的代码如下;它可以运行,但不能正常运行Java 基于单击绘制多边形,java,user-interface,drawing,components,polygon,Java,User Interface,Drawing,Components,Polygon,我正在尝试编写一个程序,允许用户在每次单击帧时绘制一条线来绘制多边形。第一次单击时,应绘制一个小正方形。每次单击之后,都应该从最后一行的端点到用户单击的位置绘制一条线。一旦用户在最初制作的正方形内单击,多边形将完成,正方形将消失。我的代码如下;它可以运行,但不能正常运行 import java.awt.Rectangle; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;
import java.util.ArrayList;
import javax.swing.JFrame;
public class DrawPolygonComponent {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("Draw a Polygon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final ArrayList<Point2D.Double> path = new ArrayList();
//addRectangle(frame, 10, 10);
//
class ClickListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent me) {
if (path.isEmpty()) {
System.out.println("First");
addRectangle(frame, me.getX(),me.getY());
path.add(new Point2D.Double(me.getX(),me.getY()));
} else {
System.out.println("Second");
Point2D.Double prev = path.get(path.size()-1);
addLine(frame, (int) prev.x, (int) prev.y,me.getX(),me.getY());
path.add(new Point2D.Double(me.getX(),me.getY()));
frame.repaint();
}
}
public void mousePressed(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}
MouseListener listener = new ClickListener();
frame.addMouseListener (listener);
frame.setVisible (true);
}
public static void addRectangle(JFrame frame, int x , int y) {
RectangleComponent r = new RectangleComponent(x, y, 10, 10);
frame.add(r);
}
public static void addLine(JFrame frame, int x1, int y1, int x2, int y2) {
LineComponent line = new LineComponent(x1, y1, x2, y2);
frame.add(line);
}
}
/////////other
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
public class LineComponent extends JComponent {
private int px;
private int py;
private int x;
private int y;
public LineComponent(int px, int py, int x, int y){
this.px=px;
this.py=py;
this.x=x;
this.y=y;
}
@Override
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.drawLine(px,py,x,y);
}
}
////////other
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
public class RectangleComponent extends JComponent {
private Rectangle box;
public RectangleComponent(int x,int y, int l, int w){
box = new Rectangle(x,y,l,w);
}
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.fill(box);
g2.draw(box);
}
}
导入java.awt.Rectangle;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.geom.Point2D;
导入java.awt.geom.Point2D.Double;
导入java.util.ArrayList;
导入javax.swing.JFrame;
公共类DrawPolyOnComponent{
公共静态void main(字符串[]args){
最终JFrame=新JFrame();
框架。设置尺寸(300400);
frame.setTitle(“绘制多边形”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终ArrayList路径=新ArrayList();
//添加矩形(帧,10,10);
//
类ClickListener实现MouseListener{
@凌驾
公共无效mouseClicked(MouseEvent me){
if(path.isEmpty()){
System.out.println(“第一”);
addRectangle(frame,me.getX(),me.getY());
add(新的Point2D.Double(me.getX(),me.getY());
}否则{
System.out.println(“第二”);
Point2D.Double prev=path.get(path.size()-1);
addLine(frame,(int)prev.x,(int)prev.y,me.getX(),me.getY());
add(新的Point2D.Double(me.getX(),me.getY());
frame.repaint();
}
}
public void mousePressed(MouseEvent me){}
公共无效MouseEvent me{}
公共无效mouseenterned(MouseEvent me){}
public void mouseExited(MouseEvent me){}
}
MouseListener listener=新建ClickListener();
frame.addMouseListener(侦听器);
frame.setVisible(true);
}
公共静态void addRectangle(JFrame-frame,intx,inty){
矩形分量器=新的矩形分量(x,y,10,10);
帧。添加(r);
}
公共静态void addLine(JFrame-frame,int-x1,int-y1,int-x2,int-y2){
LineComponent line=新的LineComponent(x1、y1、x2、y2);
帧。添加(行);
}
}
/////////其他
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入javax.swing.JComponent;
公共类LineComponent扩展了JComponent{
私有int-px;
私人机构;
私人INTX;
私营企业;
公共线组件(整数px、整数py、整数x、整数y){
这个。px=px;
这个.py=py;
这个.x=x;
这个。y=y;
}
@凌驾
公共组件(图形g){
图形2d g2=(图形2d)g;
g2.抽绳(px,py,x,y);
}
}
////////其他
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入javax.swing.JComponent;
公共类矩形组件扩展了JComponent{
专用矩形盒;
公共矩形组件(整数x,整数y,整数l,整数w){
长方体=新矩形(x,y,l,w);
}
公共组件(图形g){
图形2d g2=(图形2d)g;
g2.填充(框);
g2.绘制(方框);
}
}
JPanel
的方法创建自定义组件。将鼠标侦听器附加到此组件。覆盖它的paintComponent
方法。当鼠标事件发生时(应生成新行),调用repaint
请求更新组件
在paintComponent
方法中,重新绘制所有线条
请看和了解一些概念性的想法
Ps您可能还想查看更精确一点的内容。哪一部分失败了?它是如何失败的?仅仅转储代码并期望有人解决它并不能很好地反映在您的工作中。我不知道哪部分失败了。在我看来,一切都井然有序,应该正常运行,但在运行时,它只是呈现了一个空框架。点击它不会打印出一条线,也不会打印出一个正方形。好吧,这是更多的信息开始。。。没有GUI专家,但您正在向JFrame添加组件。。。您需要做的是覆盖JFrame
paintComponent
方法,而不是添加覆盖了该方法的组件。添加它们时,JFrame会尝试将它们作为不同的实体处理,每个实体都有不同的矩形区域。@SJuan76 FYI-JFrame
没有paintComponent
方法,即使有,也不建议以任何方式重写它-该框架包含JRootPane
,作为一个contentPane
,它位于所有其他事物的顶部……然而,您位于右侧track@MadProgrammer谢谢你的信息