我正在開發一個繪圖工具,用戶可以在JPanel
上繪製一條線。如何在繪製線條時向JPanel添加背景網格?
他會選擇一個起點,然後他拖拽這條線到一個終點來創建線條。
請注意,Java Point
類用於此處定義每個點的座標。
以下是在這種情況下使用的簡單代碼:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawLine extends JPanel {
private MouseHandler mouseHandler = new MouseHandler();
private Point p1 = new Point(0, 0);
private Point p2 = new Point(0, 0);
private boolean drawing;
public DrawLine() {
this.setPreferredSize(new Dimension(400, 200));
this.addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.blue);
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(8,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
private class MouseHandler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
drawing = true;
p1 = e.getPoint();
p2 = p1;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
drawing = false;
p2 = e.getPoint();
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
if (drawing) {
p2 = e.getPoint();
repaint();
}
}
}
private void display() {
JFrame f = new JFrame("LinePanel");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DrawLine().display();
}
});
}
}
我想要做的就是繪製的20個像素每平方米的網格。
並且用戶將選擇以釐米爲單位的比例尺,以便例如每20個像素將爲50釐米。
當用戶在面板上繪圖時,網格必須保持爲背景,以便他/她可以使用它來確定以釐米爲單位的線的尺寸。
使其更清晰,在C#中我用一個PictureBox和分配電網的背景圖像,並在下面的圖中用來繪製它作爲:
讓網格成爲一個特定的大小將需要一些工作。我似乎記得UI的渲染速度是96dpi,但可能已經改變了 – MadProgrammer
@MadProgrammer:謝謝,那麼你有什麼建議嗎? –
我一直試圖通過這個,但獲得屏幕PPI的基本計算涉及'sqrt(寬度^ 2 +高度^ 2)/對角線監視器大小(以英寸)',這是最後一部分證明很難找到。所以'2560x1600'和'22''屏幕的PPI爲'137' – MadProgrammer