2013-06-12 1 views
0

Как проверить строку, которая нарисована с помощью функции drawline между двумя переключателями, любая функция, которая помогает мне проверять линию, существует между этими кнопками или нет?Как я могу проверить линию между двумя кнопками?

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

это ваш код? – DevZer0

+0

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

+0

На самом деле я выбрал его и понял –

ответ

0

У вас может быть переменная в вашем классе ComponentLinkerTest. Например, это может быть «isLineDraw», который является логическим и инициализирует его до false. Когда вы рисуете линию между переключателями, вы можете установить для этой переменной значение true. В противном случае значение false. Затем вы можете написать функцию, которая просто управляет этой переменной.

0

Если вы используете координаты сетки, как показано на рисунке here, вы можете найти из угловых координат прямоугольник, как показано на рисунке here.