Ошибка вывода paintComponent () - PullRequest
0 голосов
/ 21 января 2012

Я пытаюсь создать программу, которая соединит две точки, которые я нажимаю в моей JPanel. Я пытаюсь соединить две точки линией. я отображал значения моих (x1, y1) и (x2, y2) координат всякий раз, когда я щелкаю мышью, и в значениях нет ошибок. но когда отображается строка, она, кажется, не следует указанным координатам, а выводится в другом месте и искажается. большинство линий будут казаться чем-то отрезанными, я думаю, что это прямоугольник, созданный линией, потому что я использовал setBounds (). Кроме того, я добавил System.out.println ("") внутри моей функции paintComponent и заметил, что она печатается несколько раз (увеличивается на 1 после каждого клика), хотя она должна печататься только один раз. Кто-нибудь может мне с этим помочь? Спасибо!

Вот два класса, которые способствуют ошибке:

КЛАСС № 1:

import java.awt.event.MouseEvent;
import javax.swing.JPanel;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Arch. Don Saborrido
 */
public class twixtBoard extends JPanel implements java.awt.event.MouseListener{
    int x1 = 0, x2, y1 = 0, y2;
    DrawLine line;
    //DrawLine line;


    public twixtBoard(){
       //requestFocus();
        setLayout(null);
        setVisible(false);
        setBounds(0,0,600,450);
        setOpaque(false);
        setFocusable(false);
        addListener();
    }

    public void addListener(){
        addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
        if (x1 == 0 || y1 == 0){
                    x1 = e.getX();
                    y1 = e.getY();
                    System.out.println(x1 + " " + y1);
        }
        else{
            x2 = e.getX();
            y2 = e.getY();
            //System.out.println(x2 + " " + y2);
            line = new DrawLine(x1, y1, x2, y2);
            line.setBounds(x1, y1, x2, y2);
            System.out.println("" + line.getLocation());
            //line.setOpaque(false);
            add(line);
            x1 = x2;
            y1 = y2;
            repaint();
        }
    }

    public void mousePressed(MouseEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseReleased(MouseEvent e) {
        ///throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseEntered(MouseEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseExited(MouseEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}

КЛАСС № 2 (класс покраски):

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Arch. Don Saborrido
 */
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.GeneralPath;
//import java.awt.geom.Line2D;
import javax.swing.JPanel;

public class DrawLine extends JPanel{
    int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
    //Line2D line;
    Stroke[] s = new Stroke[] {new BasicStroke(10.0f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)};
    //new BasicStroke(25.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL),
    //new BasicStroke(25.0f, BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER)
    GeneralPath path = new GeneralPath();

    public DrawLine(int start_x, int start_y, int end_x, int end_y){
        x1 = start_x;
        y1 = start_y;
        x2 = end_x;
        y2 = end_y;
        System.out.println(x1+ " " + y1+ " " + x2+ " " + y2+ " ");
    }

    @Override
    protected void paintComponent(Graphics g) {
        System.out.println("entered paint");
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.setStroke(s[0]);
        path.moveTo(x1,y1);
        System.out.println("x1 = " + x1 + " y1 = " + y1);
        path.lineTo(x2,y2);
        System.out.println("x2 = " + x2 + " y2 = " + y2);
        System.out.println("" + path.getBounds2D());
        g2.draw(path);
        //line = new Line2D.Float(x1, y1, x2, y2);
        //if(x1 != x2 && y1 != y2)
            //g2.draw(line);
    }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2012

Это очень сложный подход.

Попробуйте следующее:

  • создайте класс (например, LineClass) с четырьмя переменными: x1, x2, y1 и y2.
  • сохраняйте ArrayList ваших сгенерированных линий
  • рисуйте каждую линию в ArrayList на вашем JPanel, используя g.drawline (line.x1, line.y1, line.x2, line.y2) гдестрока является элементом ArrayList
class MainClass extends JPanel implements MouseListener {
  boolean clickedOnce = false;
  ArrayList<Line> lines = new ArrayList<Line>();
  int x, y;
  MainClass () {
    // init...
    addMouseListener(this);
  }
  // more MouseEvent methods
  public void mouseClicked(MouseEvent e) {
    if (!clickedOnce){
      x=e.getX(); 
      y = e.getY();
      clickedOnce = true;
    }
    else{
      lines.add(new Line(x,y,e.getX(), e.getY());
      clickedOnce = false;
      repaint();
    }
  }

  public void paintComponent (Graphics g) {
    super.paintComponent(g);
    for (Line l: lines)
      g.drawLine(l.x1, l.y2, l.x2, l.y2);
  }

  private class Line {
    public int x1, y1, x2, y2;
    Line (int x1, int y1, int x2, int y2) {
      this.x1 = x1;
      this.x2 = x2;
      this.y1 = y1;
      this.y2 = y2;
    }
  }
}
0 голосов
/ 22 января 2012

Одна из проблем заключается в том, что вы неправильно вычислили ширину и высоту. Они будут разницей между x1 и x2 и y1 и y2.

Вы также, вероятно, могли бы сделать это проще, используя Java-класс Graphics. У него есть такие методы, как drawLine (), которые, вероятно, облегчили бы вашу жизнь.

0 голосов
/ 22 января 2012
line = new DrawLine(x1, y1, x2, y2);
ine.setBounds(x1, y1, x2, y2);
add(line); 

Основная логика выглядит неправильно для меня. Вы не можете просто использовать 4 значения для размера и местоположения.

Местоположение будет минимальным из x1 / x2 и y1 / y2.

Размер (ширина, высота) будет тогда абсолютным значением (x1 - x2) и (y1 - y2).

Затем, когда вы рисуете линию, вы рисуете линию от (0, 0) до (ширина, высота).

Может быть, примеры кода из Пользовательские подходы к рисованию помогут с немного другим решением.

...