当我单击相邻的两个单选按钮然后在这些按钮之间绘制一条线时,我将条件放入我的代码中,该线仅在选择两个水平或垂直单选按钮时才会绘制,否则它会显示错误消息............它对我有用,但如果我随机单击两个单选按钮,它会抛出一个我无法理解的异常,请给出一些关于答案的描述,因为我也是初学者............这是什么意思当我编译 prog 时显示............注意:C:\Users\MUHAMMAD Umair\Desktop\ComponentLinkerTest.java 使用未经检查或不安全的操作。注意:使用 -Xlint:unchecked 重新编译以获取详细信息。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
* @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)
{
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 ();
}
}
}