考虑点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 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 来画线。
你不应该直接画成
JFrame
。标准技术是画成框架中的JPanel
。
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 教程