2011-04-05 2 views
1

사용자가 JPanel에서 클릭 한 점을 플롯하려고합니다. 좌표를 식별 할 수 있지만 repaint()이 호출되면 이전 점을 덮어 씁니다.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     

} 

새 포인트를 클릭 할 때 이전 포인트와 함께 표시되도록 프로그램을 수정하는 방법을 알려주십시오. 클릭 한 포인트 값을 저장하고 새 포인트를 클릭 할 때마다 다시 그릴 수있는 간단한 방법이 있는지 알아야합니다. 코드 스 니펫을 제공 할 수 있다면 상당한 가치가있을 것입니다.

답변

2

먼저이 Graphics를 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

당신은 점 (내가 LinkedList의 제안) 컬렉션의 좌표를 저장해야하고 각 또는 기타 루프 (그 목록을 구문 분석하지 두 목록 목록 사용을 고려 당신은 선호한다) 그리고 각 지점을 다시 칠한다.

'repaint()'가 호출 될 때마다이 작업을 수행해야하지만, 예를 들어 창 크기를 조정할 때이 메서드를 덮어 쓸 수는 없습니다. 특정 코드에 코드 스 니펫을 배치해야한다는 것을 알고 있지만 어떤 코드를 잊어 버린 것입니까? (그래픽 g)?

완벽한 답변을 제공하지 않더라도 도움이 되었기를 바랍니다.

+0

내 나쁜데, 나는 당신이 xlist와 ylist를 가지고 있다는 것을 보지 못했다. 단지 포인트를 다시 그려야한다. – dominicbri7

관련 문제