2017-03-09 12 views
0

私は初心者です。私は複数の内部クラスを使用して、JFrameに塗りつぶし矩形またはその他のグラフィックを追加しようとしています。デバッグエラーが発生しています。ここの問題は何ですか?これは間違った方法です。 JFrameとJPanelだけを使って同じことをする方法を教えてください。JFrameでマウスをクリックしたときの矩形の追加について

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

関連する問題