0

How can I check a line which is drawn with the help of drawline function between two radio button any function which help me for checking line is exist between these buttons or not?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;

/**
 * @see http://stackoverflow.com/a/12389479/909085
 */
public class ComponentLinkerTest extends JComponent {
    // private Map<JComponent, JComponent> linked;
    Map<JComponent, java.util.List<JComponent>> linked;// = new HashMap<>();
    int n = 1;

    public ComponentLinkerTest() {
        super();
        linked = new HashMap();
    }
    static JRadioButton[] button = new JRadioButton[25];

    public void gui() {
        setupLookAndFeel();
        JFrame frame = new JFrame();
        linker = new ComponentLinkerTest();
        frame.setGlassPane(linker);
        linker.setVisible(true);
        JPanel content = new JPanel();
        content.setLayout(new GridLayout(5, 5, 5, 5));
        content.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        frame.add(content);
        int i;
        for (i = 0; i < 25; i++) {
            // final JButton button = new JButton ( "Button" + i );
            button[i] = new JRadioButton();
            //  panel.add(fontButtons[i]);
            button[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    link((JRadioButton) e.getSource());
                }
            });
            content.add(button[i]);
        }
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /*public void link ( JComponent c1, JComponent c2 )
     {
     linked.put ( c1, c2 );
     repaint ();
     }*/
    public void link(JComponent c1, JComponent c2) {
        if (linked.containsKey(c1)) {
            linked.get(c1).add(c2);
        } else {
            java.util.List<JComponent> list = new LinkedList<>();
            list.add(c2);
            linked.put(c1, list);
        }
        repaint();
    }

    /*  protected void paintComponent ( Graphics g )
     {
     Graphics2D g2d = ( Graphics2D ) g;
     g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON );
     g2d.setPaint ( Color.BLACK );
     for ( JComponent c1 : linked.keySet () )
     {
     Point p1 = getRectCenter ( getBoundsInWindow ( c1 ) );
     Point p2 = getRectCenter ( getBoundsInWindow ( linked.get ( c1 ) ) );
     /* Stroke stroke = new BasicStroke(8//,
     /*BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
     new float[] { 12, 12 }, 0);
     g2d.setStroke(stroke);
     g2d.setColor(Color.RED);
     g2d.drawLine ( p1.x, p1.y, p2.x, p2.y );
     }
     }*/
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(Color.BLACK);
        for (JComponent c1 : linked.keySet()) {
            for (JComponent c2 : linked.get(c1)) {
                Point p1 = getRectCenter(getBoundsInWindow(c1));
                Point p2 = getRectCenter(getBoundsInWindow(c2));
                /* Stroke stroke = new BasicStroke(8//,
                 /*BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
                 new float[] { 12, 12 }, 0);
                 g2d.setStroke(stroke);*/
                if (n == 1) {
                    g2d.setColor(Color.RED);
                    n = 2;
                } else {
                    g2d.setColor(Color.BLUE);
                    n = 1;
                }
                g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
            }
        }
    }

    private Point getRectCenter(Rectangle rect) {
        return new Point(rect.x + rect.width / 2, rect.y + rect.height / 2);
    }

    private Rectangle getBoundsInWindow(Component component) {
        return getRelativeBounds(component, getRootPaneAncestor(component));
    }

    private Rectangle getRelativeBounds(Component component, Component relativeTo) {
        return new Rectangle(getRelativeLocation(component, relativeTo),
                component.getSize());
    }

    private Point getRelativeLocation(Component component, Component relativeTo) {
        Point los = component.getLocationOnScreen();
        Point rt = relativeTo.getLocationOnScreen();
        return new Point(los.x - rt.x, los.y - rt.y);
    }

    private JRootPane getRootPaneAncestor(Component c) {
        for (Container p = c.getParent(); p != null; p = p.getParent()) {
            if (p instanceof JRootPane) {
                return (JRootPane) p;
            }
        }
        return null;
    }

    public boolean contains(int x, int y) {
        return false;
    }
    private static ComponentLinkerTest linker;

    public static void main(String[] args) {
        ComponentLinkerTest ct = new ComponentLinkerTest();
        ct.gui();
    }
    private static JRadioButton last = null;

    private static void link(JRadioButton buton) {
        int a = 0;
        int i;
        if (last == null) {
            last = buton;
            System.out.println(last.getX());
        } else {
            for (i = 0; i < 25; i++) {
                if (buton == button[i]) {
                    /*if(button[i-1] == last || button[i+1]==last 
                     * || button[i-5] == last || button[i+5]==last)*/
                    if ((i > 0 && button[i - 1] == last)
                            || (i < (button.length - 1) && button[i + 1] == last)
                            || (i > 5 && button[i - 5] == last)
                            || (i < (button.length - 1) && button[i - 5] == last)) {
                        System.out.println("in cond");
                        linker.link(last, buton);
                        buton.setSelected(false);
                        last.setSelected(false);
                        last = null;
                    } else {
                        System.out.println("out cond");
                        buton.setSelected(false);
                        last.setSelected(false);
                        last = null;
                        JOptionPane.showMessageDialog(null, "Wrong position clicked ");
                    }
                    break;
                } else {
                    System.out.println("button not found");
                }
            }

        }
    }

    private static void setupLookAndFeel() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }
}
BenMorel
  • 34,448
  • 50
  • 182
  • 322

2 Answers2

0

You can have a variable in your ComponentLinkerTest class. For example, it can be "isLineDraw" which is boolean and intialize it to false. When you draw a line between radio buttons, you can set this variable to true. Otherwise, it is set to false. Then, you can write a function simply controls this variable.

dijkstra
  • 1,068
  • 2
  • 16
  • 39
0

If you use grid coordinates, like they shown here, you can find out of the corner coordinates form a rectangle, like they show here.

Community
  • 1
  • 1
Catalina Island
  • 7,027
  • 2
  • 23
  • 42