java椭圆_在java中移动椭圆

基本上,因为您可以使用repaint()而不是使用reapint(int,int)

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 Shape API,这提供了许多非常有用的功能,包括确定落在给定形状内的点.

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

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

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值