java绘制矩形的方法不是两种方式
嗨我在java中有一些绘制矩形的代码,但是它只会向右拖动,即使我向左拖动也向右拖动,这里是代码我有任何帮助吗?
public void mouseDragged(MouseEvent e) { Point p = e.getPoint(); int width = Math.max(selection.x - e.getX(), e.getX() - selection.x); int height = Math.max(selection.y - e.getY(), e.getY() - selection.y); selection.setSize(width, height); repaint();
请记住, Rectangle
(和Graphics#fillRect
和Graphics#drawRect
)不会呈现负宽度/高度的矩形
你需要两件事……
- 当前鼠标点(或您的案例中的拖动点)
- 首次按下鼠标的点(锚点或原点)
你应该从mousePressed
事件获得锚点…
public void mousePressed(MouseEvent e) { clickPoint = new Point(e.getPoint()); }
然后,您需要确定哪个点最小,并将其用作开始,哪个最大,并将其用于维度。
public void mouseDragged(MouseEvent e) { int minX = Math.min(e.getX(), clickPoint.x); int minY = Math.min(e.getY(), clickPoint.y); int maxX = Math.max(e.getX(), clickPoint.x); int maxY = Math.max(e.getY(), clickPoint.y); selection.x = minX; selection.y = minY; selection.width = maxX - minX; selection.height = maxY - minY; repaint(); }
import java.awt.BorderLayout; 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.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class SelectionExample { public static void main(String[] args) { new SelectionExample(); } public SelectionExample() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private Rectangle selection = new Rectangle(); private Point clickPoint; public TestPane() { MouseAdapter ma = new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { int minX = Math.min(e.getX(), clickPoint.x); int minY = Math.min(e.getY(), clickPoint.y); int maxX = Math.max(e.getX(), clickPoint.x); int maxY = Math.max(e.getY(), clickPoint.y); selection.x = minX; selection.y = minY; selection.width = maxX - minX; selection.height = maxY - minY; repaint(); } @Override public void mousePressed(MouseEvent e) { clickPoint = new Point(e.getPoint()); } }; addMouseListener(ma); addMouseMotionListener(ma); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (selection.width > 0 && selection.height > 0) { g2d.setColor(new Color(0, 0, 255, 64)); g2d.fill(selection); g2d.setColor(Color.BLUE); g2d.draw(selection); } g2d.dispose(); } } }
我们来做一些简单的代数。
selection.x - e.getX()
是相同的
- (e.getX() - selection.x)
所以你的表达是这样说的:
Math.max(- (e.getX() - selection.x), e.getX() - selection.x)
而且由于正面版本总是更大,它总是会选择正面答案,因此你永远不会得到一个负宽度/高度的矩形。