2013-09-11 2 views
0

Я хочу, чтобы моя программа будет делать следующее:JPopupMenue и кнопка

для каждой кнопки, чтобы добавить jpopupmenue-ту работу, когда нажмите на одну из кнопок, чтобы показать свою jpopupmenue и когда:

  • в первый JMenueItem был нажат, чтобы изменить цвет кнопки, которая вызывает jpopupmenue до red;
  • второй JMenueItem был нажат, чтобы изменить цвет кнопки, которая вызывает jpopupmenue до blue;
  • третий JMenueItem был щелкнут - чтобы изменить цвет кнопки, которая вызывает jpopupmenue до , желтый, и только он.

Проблема заключается в том, что при нажатии на одну из кнопок и изменить свой цвет на jpopupmenue затем вторая кнопка, которая нажата является автоматически изменился в тот же цвет ....

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 
import javax.swing.AbstractAction; 
import javax.swing.AbstractButton; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/** 
* 
* @author shani moyal 
*/ 
public class systemgraph extends JPanel implements ActionListener { 

    // data// 

    private int countplugs; 
    JPopupMenu popup; 
    private JButton btn; 
    static JFrame frame; 
    private JButton[] buttons; 
    private BufferedImage bi; 
    JMenuItem m2Frame1; 
    JMenuItem m2Frame3; 
    JMenuItem m2Frame2; 

    public systemgraph(int size) { 
     popup = new JPopupMenu(); 
     m2Frame1 = new JMenuItem("plug"); 
     m2Frame2 = new JMenuItem("second"); 
     m2Frame3 = new JMenuItem("third"); 
     popup.add(m2Frame1); 
     popup.add(m2Frame2); 
     popup.add(m2Frame3); 
     popup.addMouseListener(null); 

     buttons = new JButton[size]; 

     for (int i = 0; i < size; i++) { 
      ImageIcon circle = new ImageIcon(
        "C:\\Users\\shani moyal\\Desktop\\תמונות לגרפיקה   לפרויקט \\imagesCA4ZS816.jpg"); 
      buttons[i] = new JButton((String.valueOf(i))); 
      buttons[i].setName(String.valueOf(i)); 
      buttons[i].setBackground(Color.GREEN); 
      buttons[i].setPreferredSize(new Dimension(80, 80)); 
      buttons[i].setEnabled(true); 
      buttons[i].addMouseListener(new MouseAdapter() { 
       public void mousePressed(MouseEvent e) { 
        // JButton button = (JButton)e.getSource(); 

        final Component cmp = (Component) e.getSource(); 

        popup.show(e.getComponent(), e.getX(), e.getY()); 
        // popup.addMouseListener(this); 

        m2Frame1.addMouseListener(new MouseAdapter() { 
         @Override 
         public void mousePressed(MouseEvent e) { 
          cmp.setBackground(Color.red); 

         } 
        }); 

        m2Frame2.addMouseListener(new MouseAdapter() { 
         @Override 
         public void mousePressed(MouseEvent e) { 
          cmp.setBackground(Color.BLUE); 

         } 
        }); 
        m2Frame3.addMouseListener(new MouseAdapter() { 
         @Override 
         public void mousePressed(MouseEvent e) { 
          cmp.setBackground(Color.YELLOW); 

         } 
        }); 

        /* 
        * m2Frame1.addMouseListener(new MouseAdapter() { 
        * 
        * @Override public void mousePressed(MouseEvent e) { 
        * cmp.setBackground(Color.MAGENTA); 
        * 
        * } }); 
        */ 

       } 
      }); 

      this.add(buttons[i], BorderLayout.NORTH); 

     } 

    } 

    private static void createAndShowGUI() { 

     frame = new JFrame("ButtonDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setTitle("Simple Fiber GUI system (K&CG lab. Ariel U."); 
     systemgraph newContentPane = new systemgraph(6); 
     newContentPane.setOpaque(true); 

     frame.setContentPane(newContentPane); 

     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

    } 
} 
+1

отступы ваш друг. Не бойтесь этого. Чтобы упростить вашу жизнь, используйте IDE, например Eclipse, и просто нажмите Ctrl + Shift + F, чтобы отформатировать код или Ctrl + I, чтобы исправить отступы. – Pshemo

+0

Как написано, его очень трудно читать. Вы должны перечитать его и исправить редакцию. – MondKin

ответ

0

Когда вы нажимаете кнопку в первый раз, вы добавляете MouseListener в m2Frame1. Когда вы нажимаете другую кнопку, вы добавляете еще MouseListener, но обратите внимание, что вы не удаляете первый. Поэтому, когда вы нажимаете на JMenuItem m2Frame1, вы вызываете оба MouseListeners.

Что происходит, так это то, что при вызове 2 Mouselisteners вы получаете цвет двух кнопок.

Вы должны попытаться добавить только один MouseListener в m2Frame1 в начале кода. Конечно, вам нужно выяснить, как вы можете заставить JMenuItem выбрать, какую кнопку он должен изменить.

+0

ОК, поэтому я переместил слушателя к началу кода, но как подключить его сейчас к точной кнопке, на которую были нажаты какие-либо идеи? –

+0

нет надежды в интернете .... я не готов к воскресенью для окончательного проекта, пожалуйста, помогите –

+0

Вы можете попробовать подклассифицировать свой JMenuItem, поэтому у него есть метод setTargetButton (JButton b) ". Затем в вашем слушателе мыши JButton вы вызываете setTargetButton (b) с соответствующим b. Внутри метода JMenuItem mousePressed вы измените цвет b, независимо от того, кто является b. Таким образом, мышь JMenuItem изменит цвет кнопки, которая была последней назначена с помощью setTargetButton. – MondKin

0

Возможно, создайте свой собственный класс, который расширит JPopupMenu и будет содержать поле, которое будет использоваться для определения того, какую кнопку нужно изменить. Этот класс может выглядеть

class MyPopupMenu extends JPopupMenu{ 

    private static final long serialVersionUID = 1L; 

    private JButton button; 

    public JButton getButton() { 
     return button; 
    } 

    public void setButton(JButton button) { 
     this.button = button; 
    } 
} 

Вам нужно будет изменить JPopupMenu popup к MyPopupMenu popup и код внутри конструктора в вашем SystemGraph класса может выглядеть

public SystemGraph(int size) { 
    popup = new MyPopupMenu(); 
    m2Frame1 = new JMenuItem("red"); 
    m2Frame2 = new JMenuItem("blue"); 
    m2Frame3 = new JMenuItem("yellow"); 
    popup.add(m2Frame1); 
    popup.add(m2Frame2); 
    popup.add(m2Frame3); 
    popup.addMouseListener(null); 

    buttons = new JButton[size]; 

    for (int i = 0; i < size; i++) { 
     ImageIcon circle = new ImageIcon(
       "C:\\Users\\shani moyal\\Desktop\\תמונות לגרפיקה   לפרויקט \\imagesCA4ZS816.jpg"); 
     buttons[i] = new JButton((String.valueOf(i))); 
     buttons[i].setName(String.valueOf(i)); 
     buttons[i].setBackground(Color.GREEN); 
     buttons[i].setPreferredSize(new Dimension(80, 80)); 
     buttons[i].setEnabled(true); 
     final JButton tmp = buttons[i]; 
     buttons[i].addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       popup.setButton(tmp); 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     }); 

     this.add(buttons[i], BorderLayout.NORTH); 

    } 

    m2Frame1.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      MyPopupMenu p = (MyPopupMenu)e.getComponent().getParent(); 
      p.getButton().setBackground(Color.RED); 
     } 
    }); 

    m2Frame2.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      MyPopupMenu p = (MyPopupMenu)e.getComponent().getParent(); 
      p.getButton().setBackground(Color.BLUE); 
     } 
    }); 
    m2Frame3.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      MyPopupMenu p = (MyPopupMenu)e.getComponent().getParent(); 
      p.getButton().setBackground(Color.YELLOW); 
     } 
    }); 

} 
+0

Большое спасибо! он работает отлично !! –