私はユーザが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 cmになるようにスケールをスケールで選択します。
ユーザーがパネル上に描画している間、グリッドはバックグラウンドのままにして、線の寸法をcm単位で判断するために使用する必要があります。
グリッドを特定のサイズにすることは、いくらかの作業を必要とします。私はUIが96dpiでレンダリングされたことを覚えているようだが、それは変更されている可能性があります – MadProgrammer
@MadProgrammer:ありがとう、何をアドバイスしますか? –
私はこれを実行しようとしていますが、画面のPPIを取得するための基本的な計算には、 'sqrt(width^2 + height^2)/対角モニタサイズ(インチ)'が含まれます。見つけにくいことが証明されています。だから、2560x1600'と '22" 'の画面は、 'ReşitDönü[email protected]' 137' – MadProgrammer