gpt4 book ai didi

java - 绘制动态图。

转载 作者:行者123 更新时间:2023-11-30 07:29:05 25 4
gpt4 key购买 nike

我所说的动态图是指用户可以在屏幕上拖动顶点,然后再删除等等。

我被困在这个点上,我想绘制不止一个顶点,并且我试图避免让 JVM 在图形更改时重新绘制整个图形。

我必须让它绘制整个图形还是有其他方法可以做到这一点?

这是我的代码:

class GraphPanel extends JPanel {

private static final long serialVersionUID = 1L;
private Vector<Vertex> V=new Vector<Vertex>();
private Vertex v;
private int R = 20;

public GraphPanel() {
V.add(new Vertex(70,70));
V.add(new Vertex(10,50));
paintGraph();
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
for (int i=0;i<V.size();i++) {
if ((V.get(i).getX()<=e.getX() && V.get(i).getX()+R>=e.getX()) && ( V.get(i).getY()<=e.getY() && V.get(i).getY()+R>=e.getY())) {
v=V.get(i);
moveVertex(e.getX(),e.getY());
v.changeState();
}
}
}
public void mouseReleased(MouseEvent e) {
v.changeState();
}
});

addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
if (v.isPressed()) moveVertex(e.getX(),e.getY());
}
});
}

private void paintGraph() {
int OFFSET = 1;
for (int i=0;i<V.size();i++) {
v=V.get(i);
repaint(v.getX(),v.getY(),R+OFFSET,R+OFFSET);
}

}

private void moveVertex(int x, int y) {
int OFFSET = 1;
if ((v.getX()!=x) || (v.getY()!=y)) {
repaint(v.getX(),v.getY(),R+OFFSET,R+OFFSET);
v.setLocation(x-10, y-10);
repaint(v.getX(),v.getY(),R+OFFSET,R+OFFSET);
}
}

public Dimension getPreferredSize() {
return new Dimension(250,200);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (v!=null) {
g.setColor(Color.RED);
g.fillOval(v.getX(),v.getY(),R,R);
g.setColor(Color.BLACK);
g.drawOval(v.getX(),v.getY(),R,R);
}
}
}

public class Vertex {
private int x,y;
boolean isPressed;
Vertex(int x0,int y0) {x=x0;y=y0;isPressed=false;}
public void setLocation(int x0,int y0) {x=x0;y=y0;}
public int getX() {return x;}
public int getY() {return y;}
public boolean isPressed() {return isPressed;}
public boolean changeState() {return isPressed=!isPressed;}

}

public class Tester {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

private static void createAndShowGUI() {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new GraphPanel());
f.pack();
f.setVisible(true);
}
}

最佳答案

让我们考虑图表是椭圆列表和直线列表。在 Graph 的 paintComponent() 方法中,我们必须绘制所有列表的成员。

添加 g.getClipBounds 矩形与椭圆形(或线形)矩形相交的检查。如果它们相交,我们绘制椭圆形或直线。

当顶点移动到某个地方时,我们有新旧位置,并且可以获得要重新绘制的矩形。

使用矩形位置和大小并传入图形面板的 repaint()。

这样您将只重绘更改的区域,并且只重绘矩形中可见的椭圆和线条。

关于java - 绘制动态图。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754838/

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