只想通过画线来连接面板.
我有两个面板,两个面板都包含一个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 ) );