1

节目简介

嗨,大家好。今天早上我很无聊,决定写一个绘图程序。最终我将能够在这个软件上运行Dijksta 算法之类的东西。

当屏幕上发生任何变化时,会调用绘制所有内容的repaint方法。JPanel这是JPanel绘画方法:

public void paint(Graphics g)
{
    for(Node node : graph.getNodes()){
        node.paint(g);
    }

    for(Link link : graph.getLinks()){
        link.paint(g);
    }
}

它只是循环遍历列表中的每个元素,并绘制它们。

节点类的paint方法是:

public void paint(Graphics g)
{
    g.setColor(color);
    g.drawOval(location.x, location.y, 50, 50);
    g.setColor(Color.BLACK);
    g.drawString(name, location.x + 20, location.y + 20);
}

对于链接,它是:

public void paint(Graphics g)
{
    Point p1 = node1.getLocation();
    Point p2 = node2.getLocation();
    // Grab the two nodes from the link.
    g.drawLine(p1.x + 20, p1.y + 20, p2.x + 20, p2.y + 20);
    // Draw the line between them.
    int midPointX = ((p1.x + p2.x) / 2) + (100 / (p2.x - p1.x));
    int midPointY = ((p1.y + p2.y) / 2) + 30;
    // Compute the mid point of the line and get it closer to the line.
    g.setColor(Color.BLACK);
    g.drawString(String.valueOf(weight), midPointX, midPointY);
}

问题

JOptionPane当我使用该类时出现了我遇到的问题。当我选择添加新节点的选项并选择放置它的位置时,会inputDialog弹出一个,询问节点的名称。

节点添加得很好,因为会发生这种行为:

在此处输入图像描述 这是个常见的问题吗; 一个问题,paint或者repaint也许?

尽管如此,这里是调用的代码inputDialog

Function addNode = functionFac.getInstance(state);
                String name = "";
                while(!name.matches("[A-Za-z]+")) {
                    name = JOptionPane.showInputDialog("Please enter the name of the node.", null);
                }

                addNode.execute(stage, new NodeMessage(arg0.getPoint(), name));

PS:函数是我写的接口类型。

4

1 回答 1

4

“Swing 程序应该覆盖paintComponent()而不是覆盖paint()。”—<a href="http://www.oracle.com/technetwork/java/painting-140037.html#callbacks" rel="nofollow noreferrer">在 AWT 和 Swing 中绘画: 绘画方法

“如果您不尊重 opaque 属性,您可能会看到视觉伪影。”—<a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintComponent %28java.awt.Graphics%29" rel="nofollow noreferrer">JComponent

另请参阅检查相关问题的此问答。

于 2013-04-11T17:16:40.740 回答