2015-05-13 2 views
2

Интересно, почему метод repiant() не работает по назначению больше ... Ex:Java перекрасить() не работает по вызову

public class Main extends JPanel implements ActionListener, MouseListener,MouseMotionListener{ 

private ArrayList<Node> nodes; 
private ArrayList<Edge> edges; 
private boolean AddNode; 
private int no_Of_Nodes; 
private int width = 30, height = 30; 


public static void main(String[] args){ 
    Main M = new Main(); 
    M.Start(); 
} 

public void Start() { 
    nodes = new ArrayList<Node>(); 
    edges = new ArrayList<Edge>(); 
    JFrame f = new JFrame("SFG"); 
    JPanel main_Panel = new JPanel(new BorderLayout()); 
    JPanel buttons = new JPanel();//Buttons Containser 
    JPanel draw = new JPanel(); 
    ArrayList<JButton> bs = new ArrayList<JButton>(); 
    JButton b1 = new JButton("Add Node"); 
    b1.addActionListener(new Add_Node()); 
    JButton b2 = new JButton("Add Edge"); 
    b2.addActionListener(new Add_Edge()); 
    JButton b3 = new JButton("Add Arc"); 
    b3.addActionListener(new Add_Arc()); 
    JButton b4 = new JButton("Clear all"); 
    b4.addActionListener(new Clear()); 
    JButton b5 = new JButton("Solve"); 
    b5.addActionListener(new Solve()); 
    Bs.add(b1); 
    Bs.add(b2); 
    Bs.add(b3); 
    Bs.add(b4); 
    Bs.add(b5); 
    for (int i = 0; i < bs.size(); i++) { 
     Buttons.add(bs.get(i)); 
    } 
    Buttons.setBackground(Color.GRAY); 
    main_Panel.add(Buttons,BorderLayout.SOUTH); 
    draw.setBackground(Color.darkGray); 
    draw.addMouseMotionListener(this); 
    draw.addMouseListener(this); 
    main_Panel.add(Draw); 
    main_Panel.setBackground(Color.GRAY); 
    f.add(main_Panel); 
    f.setSize(1024, 600); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
} 

И эти методы

public void actionPerformed(ActionEvent arg0) { 
    this.repaint(); 
} 

public class Add_Node implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Add Node"); 
     addNode = true; 
    } 

} 

сейчас здесь, когда я добавить узел и вызвать не перекрашивать ничего появляется в области рисования:

public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
    if(addNode){ 
     addNode(arg0); 
     addNode = !addNode; 
    } 
    System.out.println(nodes.size()); 
    this.repaint(); 
} 

private void addNode(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
    int x = arg0.getX(); 
    int y = arg0.getY(); 
    Node n = new Node(No_Of_Nodes++); 
    n.setX_Pos(X); 
    System.out.println(x + " " + y); 
    n.setX_Pos(Y); 
    nodes.add(n); 
} 

и это мой метод краски(), который больше не работает

 public void paint(Graphics g){ 
      super.paintComponents(g); 
      FontMetrics f = g.getFontMetrics(); 
      int nodeHeight = Math.max(height, f.getHeight()); 
      System.out.println("In repaint"); 
     for (Node n : nodes) { 
       System.out.println(n.getX_Pos() + " " + n.getY_Pos()); 
       int nodeWidth = Math.max(width, f.stringWidth(Integer.toString(n.getNode_ID()))+width/2); 
       g.setColor(Color.white); 
       g.fillOval(n.getX_Pos()-nodeWidth/2, n.getY_Pos()-nodeHeight/2, nodeWidth, nodeHeight); 
       g.setColor(Color.black); 
       g.drawOval(n.getY_Pos()-nodeWidth/2, n.getY_Pos()-nodeHeight/2, nodeWidth, nodeHeight); 
       g.drawString(Integer.toString(n.getNode_ID()) , n.getX_Pos()-f.stringWidth(Integer.toString(n.getNode_ID()))/2, n.getY_Pos()+f.getHeight()/2); 
      } 
     } 

ТИА и извините за длинный вопрос :)

+0

Вы должны быть переопределение '' paintComponent' не paint'. Переопределение 'paint' и, по крайней мере, вызов' super.paint (g) 'задает проблемы. – John

+1

Это; 'paint', за которым следует это; 'super.paintComponents (g);' ОЧЕНЬ беспокоит. Не переопределяйте 'paint' и особенно НЕ обойти процесс рисования, а затем задайтесь вопросом, почему он больше не работает. Переместите свою обычную картину в метод 'paintComponent'' JPanel' и убедитесь, что вы вызываете 'super.paintComponent', прежде чем выполнять какую-либо обычную картину (обратите внимание на отсутствие' s' в конце имен методов там). – MadProgrammer

+0

См. [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) и [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/ painting-140037.html) для более подробной информации – MadProgrammer

ответ

2
  1. В вашем методе Start, вы никогда не добавить Main к JFrame. Исходя из контекстных фрагментов кода, который вы предоставили, мне остается «предположить», что вы переопределяете paint класса Main, это означает, что paint НИКОГДА не будет вызван, поскольку он фактически не привязан к отображаемому компоненту
  2. Start не следует создавать JFrame. Вы должны создать экземпляр Main, а затем добавить его в экземпляр JFrame, два должны быть отдельными. Для Main должны быть созданы и добавлены Main сам
  3. Вы не должны переопределить paint (как правило), но вы должны демонстративно НЕ обойти процесс окраски, позвонив по одному из других paint методов, как paintComponents. Вместо этого (опять-таки «предполагая» вы перекрывая paint в Main), вы должны переопределить метод paintComponent и вызвать super.paintComponent, прежде чем делать какие-либо пользовательские картины

Взгляните на Performing Custom Painting и Painting in AWT and Swing для более подробной информации.

Кроме того, вы могли бы иметь чтения через Code Conventions for the Java TM Programming Language, он будет делать это проще для людей, чтобы читать ваш код и для вас, чтобы читать другие

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