java的Swing里怎么new一条线_java – 我们如何在两个面板之间画一条线

您可以使用JFrame / JDialog GlassPane作为绘图字段轻松完成.只需将自定义组件设置为框架的玻璃窗格,然后直接在其上绘制链接.

您也可以使用框架/对话框的分层窗格执行相同操作.

这是一个如何在玻璃窗格组件上绘制这样的“链接”的小工作示例:

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.HashMap;

import java.util.Map;

/**

* @see https://stackoverflow.com/a/12389479/909085

*/

public class ComponentLinkerTest extends JComponent

{

private Map linked;

public ComponentLinkerTest ()

{

super ();

linked = new HashMap ();

}

public void link ( JComponent c1,JComponent c2 )

{

linked.put ( c1,c2 );

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

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 )

{

setupLookAndFeel ();

JFrame frame = new JFrame ();

linker = new ComponentLinkerTest ();

frame.setGlassPane ( linker );

linker.setVisible ( true );

JPanel content = new JPanel ();

content.setLayout ( new GridLayout ( 10,5,5 ) );

content.setBorder ( BorderFactory.createEmptyBorder ( 5,5 ) );

frame.add ( content );

for ( int i = 0; i < 50; i++ )

{

final JButton button = new JButton ( "Button" + i );

button.addActionListener ( new ActionListener ()

{

public void actionPerformed ( ActionEvent e )

{

link ( button );

}

} );

content.add ( button );

}

frame.setDefaultCloSEOperation ( JFrame.EXIT_ON_CLOSE );

frame.pack ();

frame.setLocationRelativeTo ( null );

frame.setVisible ( true );

}

private static JButton last = null;

private static void link ( JButton button )

{

if ( last == null )

{

last = button;

}

else

{

linker.link ( last,button );

last = null;

}

}

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

}

}

}

结果如下:

(只需一个接一个地点击任意两个按钮,它们就会被链接)

附:要使线条更粗,您可以在绘画时更改笔划:

g2d.setStroke ( new BasicStroke ( 5f ) );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值