在Java中移动椭圆形

在Java中移动椭圆形,第1张

在Java中移动椭圆形

基本上,因为

reapint(int, int)
可以使用而不是使用
repaint()

private void moveVertex(int x1, int y1) {    int OFFSET = 1;    if ((x != x1) || (y != y1)) {        x = x1 - 10;        y = y1 - 10;        repaint();    }}

这将确保整个组件被重新粉刷

虽然我不反对使用repaint(int, int),因为您的绘画过程相对简单,但是在现阶段它不会为您带来很多好处

更新了其他示例

如果我理解,您希望能够移动单个节点并使该
行保持连接状态。

虽然可以在可用的代码中实现,但更简单的解决方法是利用2D Graphics ShapeAPI,这提供了许多真正有用的功能,包括确定点是否位于给定的形状内。

这也意味着您无需跟踪大量参数,而是获得一个自包含的对象,该对象只知道应如何绘制…

import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.FontMetrics;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 java.awt.geom.Ellipse2D;import java.awt.geom.Line2D;import java.awt.geom.Rectangle2D;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 TestGraphNode {    public static void main(String[] args) {        new TestGraphNode();    }    public TestGraphNode() {        EventQueue.invokeLater(new Runnable() { @Override public void run() {     try {         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {         ex.printStackTrace();     }     Jframe frame = new Jframe("Testing");     frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);     frame.add(new Panneau());     frame.pack();     frame.setLocationRelativeTo(null);     frame.setVisible(true); }        });    }    public class Panneau extends JPanel {        private int radius = 50;        private String text = "stack";        private List<Ellipse2D> nodes;        private Ellipse2D dragged;        private Point offset;        public Panneau() { nodes = new ArrayList<>(25); nodes.add(new Ellipse2D.Float(50 - (radius / 2), 100 - (radius / 2), radius, radius)); nodes.add(new Ellipse2D.Float(350 - (radius / 2), 100 - (radius / 2), radius, radius)); addMouseListener(new MouseAdapter() {     @Override     public void mousePressed(MouseEvent e) {         for (Ellipse2D node : nodes) {  if (node.contains(e.getPoint())) {      System.out.println("Clicked...");      dragged = node;      // Adjust for the different between the top/left corner of the      // node and the point it was clicked...      offset = new Point(node.getBounds().x - e.getX(), node.getBounds().y - e.getY());      // Highlight the clicked node      repaint();      break;  }         }     }     @Override     public void mouseReleased(MouseEvent e) {         // Erase the "click" highlight         if (dragged != null) {  repaint();         }         dragged = null;         offset = null;     } }); addMouseMotionListener(new MouseAdapter() {     @Override     public void mouseDragged(MouseEvent e) {         if (dragged != null && offset != null) {  // Adjust the position of the drag point to allow for the  // click point offset  Point to = e.getPoint();  to.x += offset.x;  to.y += offset.y;  // Modify the position of the node...  Rectangle bounds = dragged.getBounds();  bounds.setLocation(to);  dragged.setframe(bounds);  // repaint...  repaint();         }     } });        }        @Override        public Dimension getPreferredSize() { return new Dimension(400, 400);        }        @Override        protected void paintComponent(Graphics g) { // declaration super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); // Draw the connecting lines first // This ensures that the lines are under the nodes... Point p = null; for (Ellipse2D node : nodes) {     g2d.setColor(Color.BLACK);     Point to = node.getBounds().getLocation();     to.x += radius / 2;     to.y += radius / 2;     if (p != null) {         g2d.draw(new Line2D.Float(p, to));     }     p = to; } // Draw the nodes... for (Ellipse2D node : nodes) {     g2d.setColor(Color.yellow);     g2d.fill(node);     if (node == dragged) {         g2d.setColor(Color.BLUE);         g2d.draw(node);     }     g2d.setColor(Color.BLUE);     FontMetrics fm = g.getFontMetrics();     int textWidth = fm.stringWidth(text);     int x = node.getBounds().x;     int y = node.getBounds().y;     int width = node.getBounds().width;     int height = node.getBounds().height;     g.drawString(text,          x + ((width - textWidth)) / 2,          y + ((height - fm.getHeight()) / 2) + fm.getAscent()); } g2d.dispose();        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5428568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存