如何使用java绘制不同倾斜度的线

问题描述 投票:0回答:2

考虑点p0x、p0y、p1x和p1y,除了它们之间的关系,deltaX = (p1x-p0x) and deltaY = (p1y - p0y)。

设计一种在图像上以任何可能的倾斜度画线的方法。我想用 JFrame 做这个,但我现在不知道如何做: `导入 java.awt.Graphics; 导入 java.awt.image.BufferedImage;

导入javax.swing.JFrame;

公共类模板扩展 JFrame{

private BufferedImage img;

public Template() {
    img = new BufferedImage(1600, 1200, BufferedImage.TYPE_INT_RGB);
    setBounds(10,10,1600,1200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setTitle("Template");
    drawLine();
    setVisible(true);
}


private void drawLine(int p0x,int p0y, int p1x ,int p1y) {
    p0x = 50;
    p0y = 50;
    p1x = 200;
    p1y = 200;
    int deltaX = (p1x-p0x);
    int deltaY = (p1y - p0y);
    
}
@Override
public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
}

public static void main(String[] args) {
    Template t = new Template();
    
}

} `

以任何可能的倾斜度画线的算法

java draw
2个回答
0
投票

在 Java 2D 中,对象通常应该是要在屏幕上绘制的 Component 类的实例。

JFrame 是 Component 类的间接子类。有关完整的层次结构,请参见此处

组件的 paint 方法描述了该对象如何出现在屏幕上。

因此,让我们有一个模板类,它有一个接受这些参数的构造函数,并覆盖 paint 方法。:

import java.awt.Graphics;
import javax.swing.JFrame;
class Template extends JFrame{

    int p0x;
    int p0y;
    int p1x;
    int p1y;

    public Template (int p0x,int p0y, int p1x ,int p1y){
        super("Demo");
        this.p0x = p0x;
        this.p1x = p1x;
        this.p0y = p0y;
        this.p1y = p1y;
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g); //to draw a JFrame!
        g2d.drawLine(p0x, p0y, p1x, p1y);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Template(120, 50, 360, 50).setVisible(true);
            }
        });
    }


}

最后一点:你不需要使用 BufferedImage 来画线。


0
投票

你不应该直接画成

JFrame
。标准技术是画成框架中的
JPanel

  • 出于演示目的,我缩小了图像的大小。
  • 构造函数非常标准地设置框架,添加面板,并将其置于屏幕中心。
  • drawLine 被调用,它在图像上绘制线条并调用重绘。
    • 这里我把线的颜色改成了红色
    • 并将其宽度设置为 3 像素
  • 压倒一切
    paintComponent
    是你在
    JPanel
  • 中的绘画方式
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Template extends JPanel {

    private BufferedImage img;
    private static int WIDTH = 500;
    private static int HEIGHT = 400;
    JFrame frame = new JFrame("TempLate");
    private int p0x, p0y, p1x, p1y;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Template().start());
    }

    public Template() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setLocationRelativeTo(null); // center
        frame.setVisible(true);
    }

    public void start() {
        p0x = 50;
        p0y = 50;
        p1x = 200;
        p1y = 200;
        drawLine();
        frame.repaint();
    }
    public void drawLine() {
        img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D imgG2D = (Graphics2D)img.getGraphics();
        // ensure a smooth line
        imgG2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        imgG2D.setColor(Color.RED);
        imgG2D.setStroke(new BasicStroke(3));
        imgG2D.drawLine(p0x, p0y, p1x, p1y);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(WIDTH, HEIGHT);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img == null) {
             return;
        }
       
        g.drawImage(img, 0, 0, this);
    }

}

有关绘画的更多信息,请查看Java 教程

© www.soinside.com 2019 - 2024. All rights reserved.