简体   繁体   中英

how can i check line between two buttons?

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();
        }
    }
}

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.

如果您使用的网格坐标,像表明,他们在这里 ,你可以找到的角坐标形成矩形,像他们表现出在这里

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM