Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于单击绘制多边形_Java_User Interface_Drawing_Components_Polygon - Fatal编程技术网

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谢谢你的信息