你有基本的想法。檢測鼠標點擊,繪製新的形狀。
下一步是要知道何時按下shift鍵並知道最後(或選定)形狀是什麼,然後才能更新它的位置。
對我來說,最簡單的解決方案是以某種方式維護形狀和位置信息。在這個例子中,我使用了一個簡單的Drawable
類,它不僅結合了位置和形狀,還有簡單的draw
方法來簡化生活。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ShiftShape {
public static void main(String[] args) {
new ShiftShape();
}
public ShiftShape() {
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 List<Drawable> drawables;
public TestPane() {
drawables = new ArrayList<Drawable>(25);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Drawable drawable = null;
if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK) {
if (!drawables.isEmpty()) {
drawable = drawables.get(drawables.size() - 1);
}
} else {
drawable = new Drawable();
drawables.add(drawable);
}
if (drawable != null) {
drawable.setLocation(e.getPoint());
repaint();
}
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Drawable drawable : drawables) {
drawable.draw(g2d);
}
g2d.dispose();
}
public class Drawable {
private Point location;
private Shape shape;
public Drawable() {
shape = new Ellipse2D.Float(0, 0, 20, 20);
}
public void setLocation(Point location) {
this.location = location;
}
public Point getLocation() {
return location;
}
public void draw(Graphics2D g2d) {
Point p = getLocation();
int x = p.x - 10;
int y = p.y - 10;
g2d.translate(x, y);
g2d.draw(shape);
g2d.translate(-x, -y);
}
}
}
}
標準圖紙就是這樣 - 繪圖。它立即生成柵格(即將形狀定義的路徑轉換爲圖形對象)。因此,這些對象作爲獨立實體「不復存在」(實際上從來不能直接響應UI事件)。您必須獨立於圖形處理對象佈局/圖形(和連接) - 然後根據需要繪製佈局/圖形(在更新所述對象之後)。當然,我確定有這樣的庫。 – user2246674
您可以查看[此處]引用的示例(http://stackoverflow.com/a/11944233/230513)。 – trashgod
你需要跟蹤你想在List WITH POINTS!中繪製的每個對象,並且對於任何移動只需清除(不是整個圖形)容器並用新的點重新繪製內容,關於要添加像運動的圓和線接口到src對象,將關聯對象移動到,由src移動觸發(觸發) – 2013-06-30 22:01:52