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

标签 java swing graphics jtable jpanel

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

最佳答案

您应该重写方法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();
            // provide enought space for frame
            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);
    }
}

关于java - 我想创建一条将 2 个 JTable 连接在一起的直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59066765/

相关文章:

java - & vs && -- 第一种情况如何使用?

java - Spring 真的不支持接口(interface)注入(inject)吗?

java - 在 JTable 中选择行时索引错误

python - Pyglet图像渲染

java - 数组程序

java - Spring Cloud Hystrix 在第一次命令调用时失败

java - 制作可点击的色谱来存储这些点击的 RGB 值

java - 看不到我在 JFrame 中添加的 JButtons(JLabel)

java - 在 Java 中使对象移动而不闪烁时遇到问题

java - 处理:是否有更好的方法使用 P3D 渲染器制作自上而下的相机