java – 我们如何在两个面板之间画一条线
发布时间:2020-05-25 12:54:29 所属栏目:Java 来源:互联网
导读:只想通过画线来连接面板. 我有两个面板,两个面板都包含一个Jtable.我想将一个面板的jtable的每个单元连接到另一个面板的另一个Jtable. 在这里,我想绘制像我用粉红色圆圈突出显示的线条. 这是我用来创建jtables的代码片段 DefaultTableModel fcdbDataModel = n
|
只想通过画线来连接面板. 我有两个面板,两个面板都包含一个Jtable.我想将一个面板的jtable的每个单元连接到另一个面板的另一个Jtable. 在这里,我想绘制像我用粉红色圆圈突出显示的线条. 这是我用来创建jtables的代码片段 DefaultTableModel fcdbDataModel = new DefaultTableModel(fcdbIdTxnArray,fcdbIdTxnColumnArray); fcdbIdTxnJTable = new FieldMapperJTable(fcdbDataModel); 这里FieldMapperJTable是我自定义的jtable类. 解决方法您可以使用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<JComponent,JComponent> linked;
public ComponentLinkerTest ()
{
super ();
linked = new HashMap<JComponent,JComponent> ();
}
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 ) ); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
