2013-04-23 81 views
0

所以,我试图结合使用paintComponent()以及使用MouseListener和MouseActionListener,但是当我运行它时遇到了很多错误,它不工作,我想要它。在这段代码中,我希望程序在按下,拖动和释放按钮时,获取印刷机的坐标,然后测量版本的坐标,然后测量形状的大小,然后绘制指定的形状由JComboBox。我也有JFrame底部按钮的颜色选择器。我想知道我可以如何运行paintComponent()方法,而不需要它自动运行,所以我可以在绘制之前给它指定规格,并根据需要绘制它。另外,我想知道是否有另一种方法可以做到这一点,而且我对于如何接近它完全错误。 我希望解释不是太混乱:)。任何帮助都很好,谢谢!如何将paintComponent(Graphics g)与MouseListener和MouseMotionListener结合起来

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

@SuppressWarnings({"unchecked", "rawtypes"}) 
public class GraphicGUI extends JPanel implements ActionListener { 

    HandlerClass handler = new HandlerClass(); 

    public int x1, x2, y1, y2, width, height; 
    public String event; 
    public JButton colorChooserButton; 
    public Color color = (Color.WHITE); 
    public JComboBox shapeBox; 
    public JLabel eventLabel; 


    public GraphicGUI(){ 
     shapeBox = new JComboBox(); 
     eventLabel = new JLabel(); 
     colorChooserButton = new JButton("Choose a color"); 
     colorChooserButton.addActionListener(this); 

     shapeBox.addItem("Oval"); 
     shapeBox.addItem("Rectangle"); 
     shapeBox.addItem("Line"); 

     super.addMouseListener(handler); 
     super.addMouseMotionListener(handler); 
    } 

    public void actionPerformed(ActionEvent arg0){ 
     if(arg0.getSource().equals(colorChooserButton)){ 
      color = JColorChooser.showDialog(null, "Pick Your Color", color); 
      if(color==null){ 
       color = (Color.BLACK); 
      } 
     } 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     this.setBackground(Color.white); 
     if(shapeBox.getSelectedItem() == "Oval") 
      if(event.equals("released")){ 
       width = x1-x2; 
       height = y1-y2; 
       g.setColor(color); 
       g.fillOval(x1, y1, width, height); 
      } 
    } 

    private class HandlerClass implements MouseListener, MouseMotionListener{ 

      //Mouse Events 
      public void mouseClicked(MouseEvent arg0){ 
       event = "click"; 
      } 
      public void mousePressed(MouseEvent arg0){ 
       event = "pressed"; 
       x1 = arg0.getX(); 
       y1 = arg0.getY(); 
       eventLabel.setText(String.format("Mouse pressed at %d, %d", x1, y1)); 
      } 
      public void mouseReleased(MouseEvent arg0){ 
       event = "released"; 
       x2 = arg0.getX(); 
       y2 = arg0.getY(); 
       eventLabel.setText(String.format("Mouse released at %d, %d", x2, y2)); 
      } 
      public void mouseEntered(MouseEvent arg0){ 
      } 
      public void mouseExited(MouseEvent arg0){ 
      } 

      //Mouse Motion Events 
      public void mouseDragged(MouseEvent arg0){ 
      } 
      public void mouseMoved(MouseEvent arg0){ 
      } 

    } 
} 
+0

你应该更确切地说你的代码现在正在做什么,即它崩溃,它是否画了一些东西等 – fstamour 2013-04-23 22:54:51

回答

0

你应该画出形状来开始。

public void paintComponent(Graphics g){ 
    //Draw the oval 
    g.setColor(color); 
    g.fillOval(x1, y1, width, height); 
} 

public void mouseReleased(MouseEvent arg0){ 
    event = "released"; 
    x2 = arg0.getX(); 
    y2 = arg0.getY();  
    if(x2 > x1) { 
     width = x2-x1; 
    } else { 
     width = x1-x2; 
    }  
    if(y2 > y1) { 
     height = y2-y1; 
    } else { 
     height = y1-y2; 
    } 
    eventLabel.setText(String.format("Mouse released at %d, %d", x2, y2)); 
} 

然后(如果你想添加更多的形状),您需要一种方法来添加形状(废话),因此你可以有形状的列表,并通过该列表进行迭代。

你真的应该(必须)初始化所有的变量。

询问您是否需要更多详细信息。 :)

+0

是的,问题是,我如何调用paintComponent方法,因为当我尝试和做g.SetColor()或g.fillOval(),g给我一个错误,因为它是一个空变量(不存在),所以我不能只是这样调用它:/ – Mattis 2013-04-23 20:54:53

+0

当然,对不起,我编辑了我的答案。 – fstamour 2013-04-23 22:49:36

+0

我做了另一个编辑。我认为你遇到的问题是因为你有时有负面因素。 – fstamour 2013-04-23 22:54:08

相关问题