repaint () стирает ранее нарисованную точку - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь нанести точки, выбранные пользователем на JPanel.Умеет определять координаты, но при вызове repaint() предыдущие точки перезаписываются.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.*;
import java.util.*;


/**
 *
 * @author emil
 */
public class GuiForTsp extends javax.swing.JFrame {

    /** Creates new form GuiForTsp */
    class MousePanelA extends JPanel implements MouseListener{
    public MousePanelA(){
        super();
        addMouseListener(this);
        System.out.println("constructing MousePanelA");
    }

    int x;
    int y;
    int count = 0;
    ArrayList xlist = new ArrayList();
    ArrayList ylist = new ArrayList();



    /*  public void update(Graphics g)
    {
        paintComponent(g);
        System.out.println("hi");
        }*/

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillRect(x,y,5,5);
        System.out.println("filling rectangle");
        //repaint();
    }

    public void mouseClicked(MouseEvent mouse){
        System.out.println("Mouse clicked"); 
        count++;   
        x = mouse.getX();
        y = mouse.getY();
        xlist.add(x);
        ylist.add(y);
        System.out.println("x " + xlist);
        System.out.println("y " + ylist);

        System.out.println("x " + x);
        System.out.println("y " + y);
        //g.fillRect(x,y,5,5);
        repaint();
    }

    public void mouseEntered(MouseEvent mouse){ }   
    public void mouseExited(MouseEvent mouse){ }
    public void mousePressed(MouseEvent mouse){ }
    public void mouseReleased(MouseEvent mouse){ }
    }

    JButton jButton1;
    MousePanelA jPanel1;

    public GuiForTsp() {
    initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jPanel1 = new MousePanelA();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBackground(new java.awt.Color(30, 157, 164));


        jButton1.setText("Generate ");

        jPanel1.setBackground(new java.awt.Color(67, 152, 46));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 287, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 283, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jButton1)
                .addGap(25, 25, 25))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(56, 56, 56)
                        .addComponent(jButton1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(22, 22, 22)
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(23, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GuiForTsp().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     

    // End of variables declaration                   

}

Подскажите, пожалуйста, как изменить программу, чтобы при нажатии на новую точку она отображалась вместе спредыдущие пункты.Мне нужно знать, есть ли какие-либо простые способы сделать это, кроме сохранения значений точек щелчка и перерисовки всех их при каждом нажатии новой точки.Было бы замечательно, если бы вы могли предоставить фрагмент кода.

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Сначала вы должны скопировать эту графику в Graphics2D.

Во-вторых, каждый перекрашивающий снова рисует весь экран, вам нужно каждый раз рисовать все точки этого метода.

В этих списках xList и yList есть предыдущие точки, почему бы их не нарисовать?

 public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    for(int i = 0; i < xList.size(); i ++)
      g2d.fillRect(xList.get(i), yList.get(i), 5, 5);
    g2d.dispose();
    }

Кроме того, рассмотрите возможность использования списка, а не двух списков

0 голосов
/ 05 апреля 2011

Пользовательские подходы к рисованию показывает два способа сделать это.

0 голосов
/ 05 апреля 2011

Вам следует сохранить координаты точек в коллекции (я предлагаю LinkedList), а затем проанализировать этот список (для каждого или любого другого цикла, который вы предпочитаете) и заново нарисовать каждую точку.

Дело в том, что вы должны делать это каждый раз, когда вызывается repaint (), но (я думаю) он вызывается, когда вы изменяете размер окна, например, и вы не можете перезаписать этот метод. Я знаю, что вы должны поместить этот фрагмент кода в определенный метод, но я забыл, какой из них (возможно, в обновлении (Графика g)?).

Надеюсь, это поможет, даже если я не дал идеальный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...