gpt4 book ai didi

java以一种方式绘制矩形而不是同时使用两种方式

转载 作者:行者123 更新时间:2023-12-01 18:34:31 27 4
gpt4 key购买 nike

嗨,我在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();

最佳答案

请记住,矩形(以及Graphics#fillRectGraphics#drawRect)不会渲染具有负宽度/高度的矩形

你需要两件事......

  1. 当前鼠标点(或您的情况下的拖动点)
  2. 第一次按下鼠标的点( anchor 或原点)

您应该从 mousePressed 事件中获取 anchor ...

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();
}

Selection Drag

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();
}
}

}

关于java以一种方式绘制矩形而不是同时使用两种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com