如何检查在两个单选按钮之间借助 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();
}
}
}