feltersnach
feltersnach

Reputation: 406

Java swing ActionEvent for button click

@HoverCraftFullOfEels helped to create this code, what would be the best way to add a button that selects all of the ellipses and changes their color from INACTIVE_COLOR to ACTIVE_COLOR.

My approach was to add another button to the button panel and define the action that would be performed.
However I was trying to add functionality from the DrawPanel2 class that is not accessible. What is the possible best way to do this?

As always, any other suggested improvements are greatly appreciated, thanks.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.*;
import java.util.List;

@SuppressWarnings("serial")
public class DrawPanelMain extends JPanel {

    private static final int PREF_W = 700;
    private static final int PREF_H = PREF_W;
    private List<Point> POINT_LIST = Arrays.asList(new Point[] {
            new Point(40, 40),
            new Point(40, 100),
            new Point(40, 160),
            new Point(40, 220),
            new Point(40, 280),
            new Point(40, 340),
            new Point(40, 400),
            new Point(40, 460),
            new Point(40, 520),
            new Point(40, 580),
            new Point(100, 100),
            new Point(100, 160),
            new Point(100, 220),
            new Point(100, 280),
            new Point(100, 340),
            new Point(100, 400),
            new Point(100, 460),
            new Point(100, 520),
            new Point(100, 580),
            new Point(160, 160),
            new Point(160, 220),
            new Point(160, 280),
            new Point(160, 340),
            new Point(160, 400),
            new Point(160, 460),
            new Point(160, 520),
            new Point(160, 580),
            new Point(220, 220),
            new Point(220, 280),
            new Point(220, 340),
            new Point(220, 400),
            new Point(220, 460),
            new Point(220, 520),
            new Point(220, 580),
            new Point(280, 280),
            new Point(280, 340),
            new Point(280, 400),
            new Point(280, 460),
            new Point(280, 520),
            new Point(280, 580),
            new Point(340, 340),
            new Point(340, 400),
            new Point(340, 460),
            new Point(340, 520),
            new Point(340, 580),
            new Point(400, 400),
            new Point(400, 460),
            new Point(400, 520),
            new Point(400, 580),
            new Point(460, 460),
            new Point(460, 520),
            new Point(460, 580),
            new Point(520, 520),
            new Point(520, 580),
            new Point(580, 580)
    });
    private JTabbedPane tabbedPane = new JTabbedPane();
    private int tabIndex = 0;

    public DrawPanelMain() {
        JPanel btnPanel = new JPanel();
        btnPanel.add(new JButton(new AddSwitchAction("Add Switch Panel")));
        btnPanel.add(new JButton(new PushConfigAction("Push Config")));
        btnPanel.add(new JButton(new ActivateAllAction("Activate All")));  //Button I want to work with

        setLayout(new BorderLayout());
        add(tabbedPane, BorderLayout.CENTER);
        add(btnPanel, BorderLayout.PAGE_END);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private class AddSwitchAction extends AbstractAction {
            public AddSwitchAction(String name) {
                super(name);
                int mnemonic = (int) name.charAt(0);
                putValue(MNEMONIC_KEY, mnemonic);
            }

        @Override
        public void actionPerformed(ActionEvent e) {
            tabIndex++;
            String title = "Switch " + tabIndex;
            DrawPanel2 tabComponent = new DrawPanel2(POINT_LIST);
            tabbedPane.add(title, tabComponent);
        }
    }

    private class PushConfigAction extends AbstractAction {
        public PushConfigAction(String name) {
            super(name);
            int mnemonic = (int) name.charAt(0);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            /*Add code sending the configuration to the switch panel*/
            JOptionPane.showMessageDialog(DrawPanelMain.this, "Configuration Pushed to Panel");
        }
    }

    //Here is the code I want to work with for making the button activate all circles
    private class ActivateAllAction extends AbstractAction {
        public ActivateAllAction(String name) {
            super(name);
            int mnemonic = (int) name.charAt(1);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            //Add code for performing action here
        }
    }

    private static void createAndShowGui() {
        DrawPanelMain mainPanel = new DrawPanelMain();
        final double version = 0.1;
        JFrame frame = new JFrame("RF Connection Panel " + version);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

}

@SuppressWarnings("serial")
class DrawPanel2 extends JPanel {
    private static final int OVAL_WIDTH = 40;
    private static final Color INACTIVE_COLOR = Color.RED;
    private static final Color ACTIVE_COLOR = Color.green;
    private List<Point> points;
    private List<Ellipse2D> ellipses = new ArrayList<>();
    private Map<Ellipse2D, Color> ellipseColorMap = new HashMap<>();

    public DrawPanel2(List<Point> points) {
        this.points = points;
        for (Point p : points) {
            int x = p.x - OVAL_WIDTH / 2;
            int y = p.y - OVAL_WIDTH / 2;
            int w = OVAL_WIDTH;
            int h = OVAL_WIDTH;
            Ellipse2D ellipse = new Ellipse2D.Double(x, y, w, h);
            ellipses.add(ellipse);
            ellipseColorMap.put(ellipse, INACTIVE_COLOR);
        }

        MyMouseAdapter mListener = new MyMouseAdapter();
        addMouseListener(mListener);
        addMouseMotionListener(mListener);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        for (Ellipse2D ellipse : ellipses) {
            g2.setColor(ellipseColorMap.get(ellipse));
            g2.fill(ellipse);
        }
    }

    private class MyMouseAdapter extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            for (Ellipse2D ellipse : ellipses) {
                if (ellipse.contains(e.getPoint())) {
                    Color c = ellipseColorMap.get(ellipse);
                    c =  (c == INACTIVE_COLOR) ? ACTIVE_COLOR : INACTIVE_COLOR;
                    ellipseColorMap.put(ellipse, c);
                }
            }
            repaint();
        }
    }
}

Upvotes: 1

Views: 173

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347332

Because you can have multiple DrawPanel2 instances and each one is contained within it's own "tab", you need to find the selected tab and extract the DrawPanel2 instance from it, for example

private class ActivateAllAction extends AbstractAction {

    public ActivateAllAction(String name) {
        super(name);
        int mnemonic = (int) name.charAt(1);
        putValue(MNEMONIC_KEY, mnemonic);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //Add code for performing action here
        Component comp = tabbedPane.getSelectedComponent();
        if (comp instanceof DrawPanel2) {
            DrawPanel2 drawPanel = (DrawPanel2) comp;
        }
    }
}

This first checks to see if the selected tab component is an instance of DrawPanel2, before it casts it.

Next, you need some way to change the state of the ellipses...

To this end, I added a activateAll method to the DrawPanel2 class, you could add one which allows to pass a boolean which sets the the state instead

public void activateAll() {
    for (Ellipse2D ellipse : ellipses) {
        ellipseColorMap.put(ellipse, ACTIVE_COLOR);
    }
    repaint();
}

Then from the Action, I simply called it

//...
DrawPanel2 drawPanel = (DrawPanel2) comp;
drawPanel.activateAll();

Upvotes: 3

Related Questions