我想创建一条将2个JTable连接在一起的直线

问题描述 投票:0回答:1

我想创建一条连接2个Jtable的直线,当我移动Jtable时,该直线仍将它们连接起来。

java swing graphics jtable jpanel
1个回答
0
投票

您应该重写方法paintChildren。像这样的东西:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;

/**
 * <code>ConnectingPanel</code>.
 */
public class ConnectingPanel extends JPanel {

    private Component[] connectingComponents = new Component[2];

    private Color lineColor = Color.BLACK;

    @Override
    protected void paintChildren(Graphics g) {
        if (connectingComponents[0] != null && connectingComponents[1] != null) {
            Color old = g.getColor();
            g.setColor(lineColor);
            Rectangle r1 = connectingComponents[0].getBounds();
            int x1 = r1.x + r1.width / 2;
            int y1 = r1.y + r1.height / 2;
            Rectangle r2 = connectingComponents[1].getBounds();
            int x2 = r2.x + r2.width / 2;
            int y2 = r2.y + r2.height / 2;
            g.drawLine(x1, y1, x2, y2);
            g.setColor(old);
        }

        super.paintChildren(g);
    }

    public void setConnectingComponent(Component c1, Component c2) {
        connectingComponents[0] = c1;
        connectingComponents[1] = c2;
    }

    public void setLineColor(Color lineColor) {
        this.lineColor = lineColor;
    }

    public static void main(String[] args) {
        JFrame frm = new JFrame("Connecting test");
        JScrollPane scroller1 = new JScrollPane(new JTable(new DefaultTableModel(3, 5)));
        JScrollPane scroller2 = new JScrollPane(new JTable(new DefaultTableModel(3, 5)));
        ConnectingPanel cp = new ConnectingPanel();
        cp.setLayout(new BorderLayout(100, 100));
        cp.setConnectingComponent(scroller1, scroller2);
        cp.setLineColor(Color.RED);
        cp.add(scroller1, BorderLayout.WEST);
        cp.add(scroller2, BorderLayout.EAST);
        JToggleButton vertButton = new JToggleButton("Arrange Vertical");
        vertButton.addActionListener(e -> {
            cp.removeAll();
            cp.add(scroller1, vertButton.isSelected() ? BorderLayout.NORTH : BorderLayout.WEST);
            cp.add(scroller2, vertButton.isSelected() ? BorderLayout.SOUTH : BorderLayout.EAST);
            cp.revalidate();
            cp.repaint();
            frm.pack();
            frm.setLocationRelativeTo(null);
        });
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(vertButton);
        frm.add(cp);
        frm.add(buttonPanel, BorderLayout.NORTH);
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.