2017-04-20 17 views
0

私は私の描画パネルをクリアしようとしていますが、私は複数の例を見てきましたが、どれも私のために働いていないようです。私は完全に動作させる必要のあるテキストフィールド/エラーをクリアするクリアボタンを持っていますが、Drawingパネルはarraylistsや "repaint"をクリアしません。 私は楕円のサイズを変更して遊んでいますので、私のdrawPointsメソッドは無視してください。あなたの主なクラスがのMouseListenerを実装していないためJPanelを再ペイント

public void mousePressed(MouseEvent event) { 
    pointArray.clear(); 
    colorArray.clear(); 
    repaint(); 
} 

しかし、それは何もしていないといない:あなたはあなたのメインのクラスで、こののmousePressedメソッドを持っている

public class Panel extends JPanel{ 
ArrayList<Point> pointArray = new ArrayList<>(); 
ArrayList<Color> colorArray = new ArrayList<>(); 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    repaint(); 
    //Create the 2D graphics object 
    Graphics2D myDrawing = (Graphics2D) g; 
    for (int i = 0; i < pointArray.size(); i++) { 
     myDrawing.setColor(colorArray.get(i)); 
     myDrawing.fillOval(pointArray.get(i).x,pointArray.get(i).y, 10, 10); 
    }   
} 
    public void drawPoints(int mouseX, int mouseY, int height, int width){ 
    Point p = new Point(mouseX,mouseY); 
    pointArray.add(p); 
    colorArray.add(this.getForeground()); 
    repaint(); 
} 

    public void changeColor(){ 
int red = (int) (Math.random() * 256); 
int green = (int) (Math.random() * 256); 
int blue = (int) (Math.random() * 256); 
this.setForeground(new Color(red,green,blue)); 
} 

public void mousePressed(MouseEvent event) { 
    pointArray.clear(); 
    colorArray.clear(); 
    repaint(); 
} 

} 

public static void main(String[] args) { 
    //set the frame 
    JFrame frame = new JFrame(); 
    frame.setSize(600, 300); 
    frame.setTitle("Multiple Panels"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //create the panel for GUI 
    JPanel panelGUI = new JPanel(); 
    panelGUI.setBackground(Color.yellow); 
    //GUIs 
    //create textfields 
    JTextField radiusField1 = new JTextField("10", 10); 
    JTextField radiusField2 = new JTextField("10", 10); 
    //create buttons 
    final JButton clearDrawingButton = new JButton("Clear Screen"); 
    final JButton changeColorButton = new JButton("Change Color"); 
    //labels 
    final JLabel displayLabel = new JLabel(""); 

    //add all GUIs to the GUI panel 
    panelGUI.add(radiusField1); 
    panelGUI.add(radiusField2); 
    panelGUI.add(changeColorButton); 
    panelGUI.add(clearDrawingButton); 
    panelGUI.add(displayLabel); 

    //create the panel to draw 
    final Panel drawingPanel = new Panel(); 
    drawingPanel.setBackground(Color.white); 
    //create the initial color 
    Color drawingColor = new Color(255,0,0); 
    //set the initial drawing color of the panel 
    drawingPanel.setForeground(drawingColor); 

    //add the grid with two columns and two rows to add the three panels 
    GridLayout grid = new GridLayout(0,2,10,20); 
    //add the grid to the frame 
    frame.setLayout(grid); 
    //add the panels to the frame 
    frame.add(panelGUI); 
    frame.add(drawingPanel); 


class MouseClickListener implements MouseListener 
    { 
     public void mouseClicked(MouseEvent event) 
     { 
      int x = event.getX(); 
      int y = event.getY(); 
      System.out.println(x + " " + y);    

      try { 
      String text1 = radiusField1.getText(); 
      String text2 = radiusField2.getText(); 
      int height = Integer.parseInt(text1); 
      int width = Integer.parseInt(text2); 
      drawingPanel.drawPoints(x, y, height, width); 

     } catch (NumberFormatException ex) { 
     displayLabel.setText("Textfields empty! Please enter number.");} 
     } 

     // Do­nothing methods 
     public void mouseReleased(MouseEvent event) {} 
     public void mousePressed(MouseEvent event) {} 
     public void mouseEntered(MouseEvent event) {} 
     public void mouseExited(MouseEvent event) {} 
     } 
    class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
      if (event.getSource()== changeColorButton){ 
       drawingPanel.changeColor(); 
      } 

      if(event.getSource()==clearDrawingButton){ 
       radiusField1.setText("10"); 
       radiusField2.setText("10"); 
       displayLabel.setText(""); 
      } 
     } 
    } 
    MouseListener listener1 = new MouseClickListener(); 
    drawingPanel.addMouseListener(listener1); 
    ActionListener listener = new ButtonListener(); 
    changeColorButton.addActionListener(listener); 
    clearDrawingButton.addActionListener(listener); 
    frame.setVisible(true); 
} 

} 
+0

paintComponent()メソッドでrepaint()を呼び出さないでください。これにより、コンポーネントは継続的に再描画()されます。 – camickr

答えて

0

でそれをやった喜んでいますよ"再塗装"。まあ

テキストフィールドをクリアコードを見て:

 if(event.getSource()==clearDrawingButton){ 
      radiusField1.setText("10"); 
      radiusField2.setText("10"); 
      displayLabel.setText(""); 
     } 

どこのArrayListをクリアコードがありますか?

ArrayListsをクリアするコードをActionListenerに追加します。

「矩形」を描画する作業コードについては、Custom Painting Approachesをチェックアウトすることもできます。それは、異なる色と "クリア"ボタンをサポートしています。

また、卵型サイズにJTextFieldを使用する代わりに、JSpinnerを使用することを検討してください。これにより、ユーザーは簡単に数値を変更することができ、入力値が数字であることを確認するために特殊な編集を追加する必要はありません。

0

:ここ

は私のコードです1つはこのメソッドを呼び出しています。

残りのコードはあまり見栄えがよくありません。私はあなたがコースの一部としてこれをやっているとか、そうでなければ仕事以外の環境でJava Swingを学ぼうとしていると思います。これが真であれば、少なくともMouseListenersを使い、代わりにAbstractActionをサブクラス化し、JButton.setAction(myAction)で使用することでボタンレスポンスのアクションを作成することをお勧めします。私は完璧に動作するようになったテキストフィールド/エラーをクリアしますが、描画パネルは、まだはっきりしていないのArrayListをしたりクリアボタンを持ってこれが今痛い見えるかもしれませんが、あなたは将来

関連する問題