2016-03-10 4 views
0

У меня проблема, я не могу решить. кнопки b1 и b2 работают безупречно, но когда я пытаюсь реализовать исполнитель действий на b3 (точно так же, как я добавил к кнопкам 1 и 2), это не сработает. Я в тупике. Я буквально скопировал и вставлял способы, которыми я реализовал b1 и b2 для b3, и он не работает! его странно, потому что он будет работать только тогда, когда я нажму на b3, а затем щелкните его правой кнопкой мыши, но я должен нажать на b3 (именованный край) и щелкнуть левой кнопкой мыши в любом месте, чтобы сообщение появилось.ActionListener не работает над кнопкой, если я не щелкнул правой кнопкой мыши?

b1 создаст прямоугольник, появится b2, чтобы создать эллипс, щелкнув правой кнопкой мыши форму, он удалит его.

import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 
    import java.awt.Insets; 
    import java.awt.Rectangle; 
    import java.awt.Shape; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 
    import java.awt.geom.Ellipse2D; 
    import java.awt.geom.Line2D; 
    import java.awt.geom.Point2D; 
    import java.util.ArrayList; 

    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JOptionPane; 
    import javax.swing.JPanel; 
    import javax.swing.JTextField; 
    import javax.swing.SwingUtilities; 

    public class Tutorial extends JPanel 
{ 

    /** 
* 
*/ 
private static final long serialVersionUID = 1L; 
    public static void storeShape(Shape shape){ 
     shapes.add(shape); 
    } 
    public static void removeShape(int index){ 
     shapes.remove(index); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 

     if(shape != null) 
    for (Shape shape1 : shapes){ 
     g2.draw(shape1); 
    } 

    } 
    private static ArrayList<Shape> shapes = new ArrayList<Shape>(); 
    private Object lastbuttonpressed; 
    static Shape shape; 
    public static void main (String[] args){ 

     Tutorial t = new Tutorial(); 
     JFrame f = new JFrame(); 
     f.setTitle("Tutorial"); 
     f.setSize(600, 400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(t); 
     JPanel p = new JPanel(new GridBagLayout()); 


     JButton b1 = new JButton("Rectangle"); 
     JButton b2 = new JButton("Ellipse"); 
     JButton b3 = new JButton("Edge"); 
     JButton b4 = new JButton("Label"); 
     GridBagConstraints gbc2 = new GridBagConstraints(); 
     gbc2.insets = new Insets(5,5,5,5); 
     gbc2.gridx = 0; 
     gbc2.gridy = 0; 
     p.add(b1,gbc2); 
     gbc2.gridx = 1; 
     gbc2.gridy = 0; 
     p.add(b2,gbc2) ; 
     gbc2.gridx = 2; 
     gbc2.gridy = 0; 
     p.add(b3,gbc2); 
     gbc2.gridx = 0; 
     gbc2.gridy = 1; 
     p.add(b4,gbc2); 
     f.add(p, BorderLayout.NORTH); 
     JTextField textField = new JTextField(" text field"); 
     gbc2.gridx = 1; 
     gbc2.gridy = 1; 
     p.add(textField, gbc2); 



     b1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 

       t.lastbuttonpressed = e.getSource(); 

      } 
     }); 
     b2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 

       t.lastbuttonpressed = e.getSource(); 
      } 
     }); 
     b3.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 

       t.lastbuttonpressed = e.getSource(); 
      } 
     }); 

     f.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       if (SwingUtilities.isLeftMouseButton(e)){ 
       if (t.lastbuttonpressed == b1){ 



        shape = new Rectangle(e.getX()-50,e.getY()-120,100,50); 
        storeShape(shape); 
        t.repaint(); 
       } 
       else if (t.lastbuttonpressed == b2){ 
        shape = new Ellipse2D.Double(e.getX()-50,e.getY()-120,100,50); 
        storeShape(shape); 
        t.repaint(); 
       } 

      } 
       else if (t.lastbuttonpressed == b3){ 
        JOptionPane.showMessageDialog(null, "button 3"); 
        t.repaint(); 
       } 
       else if (SwingUtilities.isRightMouseButton(e)){ 

        for (int i=0; i<shapes.size(); i++){ 

        if (shapes.get(i).contains(e.getX()-50,e.getY()-100)){ 

       shapes.remove(i); 
       t.repaint(); 

        } 

      } 
       } 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void mouseClicked(MouseEvent e) { 


      } 

     }); 
     f.setVisible(true); 
    } 

}

ответ

0

Ваше форматирование поодаль, что делает трудно читать. Похоже, вы проверяете для b3 нажат:

еще если (t.lastbuttonpressed == b3) {

вне этого, если проверка:

если (SwingUtilities.isLeftMouseButton (е)) {

+0

ах я понял. это связано с фигурными скобками в инструкции if mousePressed. мой новый вопрос: как я могу хранить объект Line2D.Double в массиве типа Shape? – Bossrevz

+0

Будучи java, я бы использовал ArrayList . – zecmo