我想创建一条连接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();
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);
}
}