JPopupMenue и кнопки
Я хочу, чтобы моя программа делала следующее:
для каждой кнопки добавить jpopupmenue- это работает, когда нажимаете на одну из кнопок, чтобы показать ее jpopupmenue, и когда:
- первый JMenueItem был нажат - чтобы изменить цвет кнопки, которая вызывает jpopupmenue на красный;
- щелкнул второй JMenueItem - чтобы изменить цвет кнопки, вызывающей jpopupmenue, на синий;
- щелкнул третий 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) {
}
}
2 ответа
Когда вы нажимаете кнопку в первый раз, вы добавляете MouseListener в m2Frame1. Когда вы нажимаете другую кнопку, вы добавляете другой MouseListener, но учтите, что вы не удаляете первый. Поэтому, когда вы нажимаете JMenuItem m2Frame1, вы вызываете оба MouseListener.
Здесь происходит то, что при вызове 2 Mouselistener вы меняете цвет 2 кнопок.
Вы должны попытаться добавить только один MouseListener к m2Frame1 в начале кода. Конечно, вам нужно выяснить, как вы можете заставить JMenuItem выбирать, какую кнопку он должен изменить.
Может быть, создать свой собственный класс, который будет расширяться 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);
}
});
}