2013-04-11 5 views
1

Краткое описание программыОдд функциональность перекрашивать

Привет, ребята. Мне стало скучно сегодня утром и решил написать графическую программу. В конце концов я смогу запустить такие вещи, как Алгоритм Dijksta's на этом программном обеспечении.

Когда что-либо изменяется на экране, делается вызов метода repaintJPanel, где все окрашено. Это метод JPanel краски:

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

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

Он просто перебирает каждый элемент в списках, и рисует их.

Метод краска для класса узла является:

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 с запросом имени узла.

Узлы добавляются в порядке, для этого происходит:

enter image description here ли это общая проблема; вопрос с 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: Функция является тип интерфейса, который я написал.

+0

+1 для тщательного изучения необычного представления общей проблемы. – trashgod

ответ

4

«Программы поворота должны переопределять paintComponent() вместо переопределения paint().» - Painting in AWT and Swing: The Paint Methods.

«Если вы не почитаете непрозрачной собственности вы, вероятно, увидеть визуальные артефакты.» - JComponent

См также это Q&A, что рассматривает связанный с этим вопрос.

+1

Ах отлично! Я просто переименовал 'paint' в' paintComponent' и назвал 'super.paintComponent', и он полностью удалил проблему. Хороший ответ, спасибо за ссылки :) +1! – christopher

+0

Кроме того, контекст Graphics разделяется во время процесса рисования, так что вы, вероятно, будете иметь прежний компонент, окрашенный еще в Graphics. Одна из работ paintComponent заключается в подготовке окраски компонентов. – MadProgrammer

+0

Для справки @MadProgrammer рассмотрел аналогичные аномалии, используя термин [«цепочка красок»] (http://stackoverflow.com/search?q=user%3A992484+%22paint+ цепь% 22). – trashgod

Смежные вопросы