2017-10-11 18 views
0

コンパイルされたプログラムはエラーなしで実行されますが、キャンバス内をクリックすると形状は生成されません。 compiled program PaintComponentクラスJava GUI - 抽象クラスから描画メソッドを呼び出す

private class CanvasPanel extends JPanel { 

    //this method draws all shapes 
    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 
     setBackground(Color.WHITE); 

     for (int i = 0; i < shapeList.size(); i++) { 
      ((Shape) shapeList.get(i)).draw(page); 
     } 
    }  
} 

ポインタリスナクラス。

public class PointListener implements MouseListener 
    { 
    public void mousePressed (MouseEvent event) 
     { 
     Point pt = event.getPoint(); 
     //pointList.add(event.getPoint()); 
     if (currentShape.equals("circle")) { 
      nShape = new Circle((int)pt.getX(), (int)pt.getY(), currentSize, currentSize, currentColor); 
      shapeList.add(nShape); 
     } else { 
      nShape = new Square((int)pt.getX(), (int)pt.getY(), currentSize, currentSize, currentColor); 
      shapeList.add(nShape); 
     } 
     repaint(); 
     } 

抽象Shapeクラス

public abstract class Shape { 

    protected int x; 
    protected int y; 
    protected int width; 
    protected int height; 
    protected Color color; 

    public Shape (int x1, int y1, int width, int height, Color color) { 
     this.x = x1; 
     this.y = y1; 
     this.width = width; 
     this.height = height; 

    } 

    public void draw (Graphics page) { 
    } 
} 

だから、理想的に、ユーザは自分の選択したオプションでキャンバスをクリックすると、クリックは、リスト内の形状オブジェクトとストアを生成します。ペイントコンポーネントはリスト全体を循環し、四角形/円の子クラスから引き出し、選択した図形を描画するシェイプクラス描画メソッドを呼び出します。残念ながら、何も起こっていません。何か不足していますか? ありがとう!

ここには私のプロジェクトがすべて含まれているレポがあります。 https://github.com/Purpleshoes/assignment7

+0

'下記参照、WholePanelクラスにいくつかの変更を加えた'「行方不明何かか?」 - 私たちはコンパイルして実行することができます[MCVE]、コード、およびそれが問題を示しています。コード全体を要求するのではなく、抽出された部分集合、ここに全体を投稿するのに十分な大きさの部分集合、コンパイルして実行する部分を求めていることに注意してください。リンクを見てください。 –

+0

たとえば、shapeListはどこに保管されていますか?どのくらいのshapeListsがありますか?すべてはどのようにつながっていますか? –

+0

'PointListener'の情報は' CanvasPanel'とどのように共有されていますか? – MadProgrammer

答えて

0

私はあなたのWholePanelクラスに通過したと下記たあなたはComboListenerクラスを作成し、決してそれはあなたがPointListenerクラスを作成していることを使用したことがないこのcomboShapes.addActionListener(new ComboListener());

  • のように使用すべきである、ということで使用

    1. を発行このように使用する必要があります。canvas.addMouseListener(new PointListener());

    2. ローカルしたがって、actionPerformed()ComboListenerクラスのメソッドが

    3. actionPerformed方法ButtonListenerクラスでは、任意の意味をなさないので、uはロジック

    に再実行する必要があります動作しません代わりに、クラスレベルJComboBoxインスタンスの210例、したがって、私は

    import java.awt.*; 
    import javax.swing.*; 
    import java.awt.event.*; 
    import java.util.ArrayList; 
    
    public class WholePanel extends JPanel { 
    
        private Color currentColor = Color.black; 
        private CanvasPanel canvas; 
        private JPanel topPanel; 
        private JButton undo; 
        private ArrayList shapeList; 
        int flag = 1; //Debug 
        private String currentShape = "circle"; 
        private int currentSize = 10; 
    
        private ArrayList pointList; 
    
        Shape nShape; 
    
        JComboBox<String> comboShapes = new JComboBox<String>(); 
        JComboBox<Integer> comboSize = new JComboBox<Integer>(); 
        JComboBox<String> comboColors = new JComboBox<String>(); 
    
        public WholePanel() { 
         currentColor = Color.black; 
         shapeList = new ArrayList(); 
         pointList = new ArrayList(); 
    
         topPanel = new JPanel(); 
    
         canvas = new CanvasPanel(); 
         canvas.addMouseListener(new PointListener()); 
    
         JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topPanel, canvas); 
    
         setLayout(new BorderLayout()); 
         add(sp); 
    
         undo = new JButton("Undo"); 
    
         comboShapes = new JComboBox<String>(); 
         comboShapes.addItem("circle"); 
         comboShapes.addItem("square"); 
         comboShapes.addActionListener(new ComboListener()); 
    
         comboSize = new JComboBox<Integer>(); 
         comboSize.addItem(10); 
         comboSize.addItem(20); 
         comboSize.addItem(30); 
         comboSize.addItem(40); 
         comboSize.addItem(50); 
         comboSize.addActionListener(new ComboListener()); 
    
         comboColors = new JComboBox<String>(); 
         comboColors.addItem("Black"); 
         comboColors.addItem("Red"); 
         comboColors.addItem("Blue"); 
         comboColors.addItem("Green"); 
         comboColors.addItem("Orange"); 
         comboColors.addActionListener(new ComboListener()); 
    
         topPanel.add(comboShapes, BorderLayout.WEST); 
         topPanel.add(comboSize, BorderLayout.CENTER); 
         topPanel.add(comboColors, BorderLayout.EAST); 
         topPanel.add(undo, BorderLayout.EAST); 
        } 
    
        private class CanvasPanel extends JPanel { 
    
         //this method draws all shapes 
         public void paintComponent(Graphics page) { 
          super.paintComponent(page); 
          setBackground(Color.WHITE); 
    
    //   page.setColor(nShape.color); 
    //   page.drawOval(nShape.x, nShape.y, nShape.width, nShape.height); 
    //   page.fillOval(nShape.x, nShape.y, nShape.width, nShape.height); 
          for (int i = 0; i < shapeList.size(); i++) { 
           //Point drawPoint = (Point) pointList.get(i); 
           ((Shape) shapeList.get(i)).draw(page); 
          } 
         } 
    
         @Override 
         public void paint(Graphics g) { 
    
          super.paint(g); 
          setBackground(Color.WHITE); 
    
          //page.setColor(nShape.color); 
          //page.drawOval(nShape.x, nShape.y, nShape.width, nShape.height); 
          //page.fillOval(nShape.x, nShape.y, nShape.width, nShape.height); 
          for (int i = 0; i < shapeList.size(); i++) { 
           //Point drawPoint = (Point) pointList.get(i); 
           ((Shape) shapeList.get(i)).draw(g); 
          } 
    
         } 
    
        } 
    
        private class ButtonListener implements ActionListener { 
    
         public void actionPerformed(ActionEvent event) { 
          undo = new JButton("Undo"); 
          undo.addActionListener(new ButtonListener()); 
         } 
        } // end of ButtonListener 
    
        // listener class to set the color chosen by a user using 
        // color combo box, set the size chosen using size combo box 
        // or set the shape (circle or square) using shape combo box 
        private class ComboListener implements ActionListener { 
    
         public void actionPerformed(ActionEvent event) { 
          System.out.println("action action"); 
          if (event.getSource() == comboShapes) { 
           currentShape = (String) comboShapes.getSelectedItem(); 
          } 
    
          if (event.getSource() == comboSize) { 
           currentSize = (int) comboSize.getSelectedItem(); 
          } 
    
          if (event.getSource() == comboColors) { 
           currentColor = Color.getColor((String) comboColors.getSelectedItem()); 
          } 
         } 
        } // end of ComboListener 
    
        // listener class that listens to the mouse 
        public class PointListener implements MouseListener { 
    
         public void mousePressed(MouseEvent event) { 
          Point pt = event.getPoint(); 
          //pointList.add(event.getPoint()); 
          if (currentShape.equals("circle")) { 
           nShape = new Circle((int) pt.getX(), (int) pt.getY(), currentSize, currentSize, currentColor); 
           shapeList.add(nShape); 
          } else { 
           nShape = new Square((int) pt.getX(), (int) pt.getY(), currentSize, currentSize, currentColor); 
           shapeList.add(nShape); 
          } 
          repaint(); 
         } 
    
         public void mouseReleased(MouseEvent event) { 
         } 
    
         public void mouseClicked(MouseEvent event) { 
         } 
    
         public void mouseEntered(MouseEvent event) { 
         } 
    
         public void mouseExited(MouseEvent event) { 
         } 
    
        } // end of PointListener 
    
    } // end of Whole Panel Class 
    
  • 関連する問題