Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_Awt_Java 2d - Fatal编程技术网

Java 一行一行地画矩形

Java 一行一行地画矩形,java,user-interface,awt,java-2d,Java,User Interface,Awt,Java 2d,我想用Java中的hline和vline绘制矩形。我在绘制它时遇到了一些问题,我不知道具体情况,但我认为这是在hline1和vline1方法中 没有错误,只是参数内的算法有问题 这是密码 package hw1; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; public class main extends Frame { Graphics2D g2d; main() { addWi

我想用Java中的
hline
vline
绘制矩形。我在绘制它时遇到了一些问题,我不知道具体情况,但我认为这是在
hline1
vline1
方法中

没有错误,只是参数内的算法有问题

这是密码

 package hw1;
 import java.awt.*;
 import java.awt.geom.*;
 import java.awt.event.*;

 public class main extends Frame {

Graphics2D g2d;
main()
{
    addWindowListener(new hw1.main.MyFinishWindow());
}

public class MyFinishWindow extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }
}

public void paint (Graphics g)
{
    g2d=(Graphics2D)g;

    hline(0,40,250,40);
    vline(250,40 , 250 , 80);
    hline1(250,80,0,80);
    vline1(0,80 , 0 , 40);

}

public void hline(int x1,int y1 , int x2 , int y2)
{
    for(int x=x1 ; x<=x2 ; x++)
        putpixel(x,y1,Color.blue);
}

public void vline(int x1 ,int y1 , int x2 , int y2 )
{
    for(int y=y1;y<=y2;y++)
        putpixel(x1,y,Color.blue);
}

 public void hline1(int x1,int y1 , int x2 , int y2)
{
    for(int x=x1 ; x<=x2 ; x++)
        putpixel(x,x1,Color.blue);
}

public void vline1(int x1 ,int y1 , int x2 , int y2 )
{
    for(int y=y1;y<=y2;y++)
        putpixel(x1,y,Color.blue);
}

public void putpixel(int x , int y , Color c)

{
    g2d.setColor(c);
    g2d.drawLine(x, y, x, y);
}

 public void putpixel(int x , int y , Color c , int rad)
 {
     g2d.setColor(c);
     if(rad>4) rad=4;
     if(rad<=0) rad=1;
     g2d.drawOval(x-rad/2, y-rad/2, rad, rad);
 }


public static void main(String[] args) {
    // TODO code application logic here

    main f=new main();
    f.setTitle("Computer Graphics:Java 2D prpgram");
    Dimension screenSize=
            Toolkit.getDefaultToolkit().getScreenSize();
    int width=(int) screenSize.getWidth();
    int height=(int) screenSize.getHeight();
    f.setSize(width, height);
    f.setVisible(true);
}

}
包装hw1;
导入java.awt.*;
导入java.awt.geom.*;
导入java.awt.event.*;
公共类主框架{
图形2d-g2d;
main()
{
addWindowListener(新的hw1.main.MyFinishWindow());
}
公共类MyFinishWindow扩展了WindowAdapter
{
公共无效窗口关闭(WindowEvent e)
{
系统出口(0);
}
}
公共空间涂料(图g)
{
g2d=(图2d)g;
hline(0,40250,40);
vline(250,40,250,80);
hline1(250,80,0,80);
vline1(0,80,0,40);
}
公共无效hline(int-x1、int-y1、int-x2、int-y2)
{
对于(int x=x1;xTry
drawLine()

试试
drawine()


主要的问题是你总是增加循环变量,而不考虑哪个边值比另一个边值大

   vline1(0,80 , 0 , 40);
这将从80开始y,并增加它直到它达到40

这至少是它应该做的

public void vline(int x1 ,int y1 , int x2 , int y2 )
{
    //use min and max
    for(int y=Math.min(y1, y2);y<=Math.max(y1,y2);y++) { //always use brackets!!!
        putpixel(x1,y,Color.blue);
    }
}
那就足够了

  • 更不用说,将这一点提升到一个新的层次:最好为所有类型的线条提供一种方法:这就是
    drawLine()
    ,正如@ling.s所指出的。它可以正确处理所有类型的线条


  • 这个故事的寓意是:了解你的API,不要重新发明轮子(除非这是为了学校,任务是重新发明它…)

    主要问题是你总是增加循环变量,而不考虑哪个边界值比另一个边界值大

       vline1(0,80 , 0 , 40);
    
    这将从80开始y,并增加它直到它达到40

    这至少是它应该做的

    public void vline(int x1 ,int y1 , int x2 , int y2 )
    {
        //use min and max
        for(int y=Math.min(y1, y2);y<=Math.max(y1,y2);y++) { //always use brackets!!!
            putpixel(x1,y,Color.blue);
        }
    }
    
    那就足够了

  • 更不用说,将这一点提升到一个新的层次:最好为所有类型的线条提供一种方法:这就是
    drawLine()
    ,正如@ling.s所指出的。它可以正确处理所有类型的线条


  • 这个故事的寓意是:了解你的API,不要重新发明轮子(除非这是为了学校,任务是重新发明它…)

    作为旁注,你可以使用
    java.awt.Polygon

      Polygon p;
    
       p = new Polygon();
       p.addPoint(10, 10);
       p.addPoint(100,10);       
       p.addPoint(100,100);
       p.addPoint(10,100);
    
     .....
    
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        setBackground(Color.white);
        g.fillPolygon(p);   
    }
    

    作为旁注,您可以使用
    java.awt.Polygon

      Polygon p;
    
       p = new Polygon();
       p.addPoint(10, 10);
       p.addPoint(100,10);       
       p.addPoint(100,100);
       p.addPoint(10,100);
    
     .....
    
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        setBackground(Color.white);
        g.fillPolygon(p);   
    }
    

    为什么要使用AWT而不是Swing?请参阅上的答案,其中有许多放弃使用AWT组件的好理由。如果您需要支持较旧的基于AWT的API,请参阅。“我想用Java中的hline
    vline
    绘制矩形。”顺便说一句-特别是为什么这样,而不是(现在的2)其他绘制方框的好方法?如果是“由老师指定的”,那么最好弄清楚这一点。程序员在编程时倾向于“使用最简单的工具”,而您正在使用的方法并不是最简单的方法。为什么要使用AWT而不是Swing?请参阅下面的答案,因为有很多很好的理由放弃使用AWT组件。如果您需要支持较旧的基于AWT的API,请参阅。“我想用Java中的
    hline
    vline
    绘制矩形。”顺便说一句-为什么会这样,而不是(现在的2)其他绘制方框的好方法?如果它是“由老师指定的”,那么最好清楚地说明这一点。程序员在编程时倾向于“使用最简单的工具”,而您正在使用的方法并不是最简单的方法。我们必须使用hline和vline的算法,我们不能使用drawline的乐趣。我们必须使用hline和vline的算法vline,我们不能使用drawline fun。解决方案必须没有任何额外的功能,我认为问题在于hline1和vline1的putpixel fun,如何准确地将putpixel fun称为putpixel fun。可以用y替换x1,就像这样。解决方案必须没有任何额外的功能,我认为问题在于hline1和vline1的putpixel fun,如何完全可以称之为像素乐趣。可以用y替换x1,如下所示。