重绘JPanel

时间:2017-04-20 17:10:39

标签: java swing

所以我试图清除我的绘图面板,我看了几个例子但是它们似乎都不适合我?我有一个清除按钮,清除我完全工作的文本字段/错误,但绘图面板仍然不清除arraylists或"重绘"。 我正在四处改变椭圆的大小,所以请忽略我的drawPoints方法。

这是我的代码:

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);
}  

}

2 个答案:

答案 0 :(得分:0)

你的主类中有这个mousePressed方法:

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

但它没有做任何事情,因为你的主类没有实现MouseListener,也没有人调用这个方法。

你的其余代码看起来不是很漂亮。我假设您正在将此作为课程的一部分,或者只是尝试在非工作环境中学习Java Swing。如果这是真的,我建议您重新开始 - 至少使用MouseListeners,而是通过继承AbstractAction并将其与JButton.setAction(myAction)一起使用来为您的按钮响应创建Actions;现在这看起来很痛苦,但你会很高兴你将来做到这一点

答案 1 :(得分:0)

  

我有一个清除按钮,清除了我完全正常工作的文本字段/错误,但是“绘图”面板仍然没有清除arraylists或&#34;重绘&#34;。

看看清除文本字段的代码:

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

清除ArrayLists的代码在哪里?

添加代码以将ArrayLists清除为ActionListener

您还可以查看Custom Painting Approaches以获取绘制&#34;矩形&#34;的工作代码。它支持不同的颜色和&#34;清除&#34;按钮。

此外,您可能需要考虑使用JSpinner,而不是使用JTextField作为椭圆尺寸。这将允许用户轻松更改数值,并且您不必添加任何特殊编辑以确保输入的值是数字。