2017-03-09 6 views
0

초보자입니다. JFrame에 여러 개의 내부 클래스를 사용하여 채워진 사각형 또는 다른 그래픽을 추가하려고합니다. 디버깅 오류가 발생합니다. 여기에 어떤 문제가 있습니까? 이것이 잘못된 방법 일 경우. JFrame과 JPanel을 사용하는 방법 만 설명하십시오.JFrame에서 마우스를 클릭했을 때 Rectangle 추가에 관해서

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

public class RainBow{ 

    JFrame frame; 

    public static void main(String[] args){ 
     RainBow bow = new RainBow(); 
     bow.go(); 
    } 

    public class Paint extends JPanel{ 
     public void paintComponent(Graphics g){ 
      g.setColor(Color.red); 
      g.fillRect(100, 100, 100, 100); 

     } 
    } 

    public void go(){ 
     frame.addMouseListener(new ListenMouse()); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 

    public class ListenMouse implements MouseListener{ 
     public void mosueClicked(MouseEvent a){ 
      Paint p = new Paint(); 
      frame.getContentPane().add(p); 
      frame.setVisible(true); 
     } 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

} 

} 
+0

어떤 "디버깅 오류"가 발생 했습니까? 어떻게 그들을 고치려고 했습니까? –

답변

1

게시 된 코드에는 여러 가지 문제가 있습니다. 주석의 설명과 함께이 작업 예제를 참조하십시오.

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

public class RainBow { 

    JFrame frame; 
    boolean paintRectangle = false; 

    public static void main(String[] args) { 
     RainBow bow = new RainBow(); 
     bow.go(); 
    } 

    public class Paint extends JPanel { 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); // should always be done 
      if (paintRectangle) { 
       g.setColor(Color.red); 
       g.fillRect(100, 100, 100, 100); 
      } 
     } 
    } 

    public void go() { 
     frame = new JFrame(); // otherwise NPE 
     Paint paint = new Paint(); 
     paint.addMouseListener(new ListenMouse()); // add listner to paint 
     frame.add(paint); // add paint at start-up 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     // ensures JVM shuts down when frame is closed. 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

    public class ListenMouse extends MouseAdapter { 

     // this method is incorrectly spelled! 
     public void mosueClicked(MouseEvent a) { 
     } 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      /* requires special handling to add components on the fly */ 
      //Paint p = new Paint(); 
      paintRectangle = true; 
      frame.repaint(); // forces the Paint to be painted as well. 
     } 
    } 
} 
+1

'getPreferredSize'를 오버라이드시키는 것이 좋지만,'BorderLayout'을 사용하고'pack'을 사용하지 않기 때문에 그들은 – MadProgrammer

+0

@MadProgrammer True의 효과를 보지 못합니다. 나는 그보다 더 일찍 멈추기로 결정했는데, 코드의 주된 문제들 (게시 된 것을 포함해서 그것은 'NPE'를 지나치지 않았다!)을 다루기 위해서였다. –

+0

네, 지난 패스에서 그들을 압도하지 않는 것이 좋습니다 : P – MadProgrammer