如果它们的值相等,则2个不同JTable的2个单元之间的链接

时间:2018-03-13 11:54:02

标签: java swing jtable

我有2个表分别持有所述值:

L1 = [“one”,”two”,”three”]
L2 = [“one”,”three”,”two”]

我想在2个表之间添加一个链接 每个等效字符串。链接需要是动态的,并在向下滚动任一表时移动。这两个表位于同一个面板中。

对于这个或任何想法有没有预定义的方法如何做到这一点?

1 个答案:

答案 0 :(得分:0)

绝对没有“开箱即用”的方法,但我建议如下。

1)将两个表所在的面板移动到JLayeredPane中。

2)使用表格在面板上方的JLayeredPane中添加另一个面板,因此组件层次结构应如下所示:

JLayeredPane
|---JPanel - the new top panel
|---JPanel - your original panel
   |---JTable
   |---JTable

3)使新的顶部面板不透明,以便透视,你可以看到你的桌子。

4)覆盖这个新的最顶层面板的paintComponent(Graphics g)方法。如果您使用下面的示例,您可以确认到目前为止所有内容都没问题,因此您应该在所有表格中看到对角红线:

@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.red);
    g.drawLine(0, 0, getWidth(), getHeight());
}

5)如果您执行上述操作并且可以看到红线,则表示下一步已准备就绪。

6)从paintComponent函数中删除两行并添加逻辑以绘制所需的行。例如:

@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.red);

    for (int row1=0; row1<table1.getRowCount(); row1++) {

        //look up value and bounds of the row in table 1
        Object value1 = table1.getValueAt(row1, 0);
        Rectangle r1 = table1.getCellRect(row1, 0, true);

        //find the corresponding row number in table 2
        for (int row2=0; row2<table2.getRowCount(); row2++) {
            Object value2 = table2.getValueAt(row2, 0);
            if (value2.equals(value1)) {

                Rectangle r2 = table2.getCellRect(row2, 0, true);

                //convert both points to be the in the component space of this panel
                Point p1 = SwingUtilities.convertPoint(table1, r1.getLocation(), this);
                Point p2 = SwingUtilities.convertPoint(table2, r2.getLocation(), this);

                //and draw the line
                g.drawLine(r1.x, r1.y, r2.x, r2.y);

                break;
            }
        }
    }
}

注意 - 上面的示例基于这样的假设:您的两个表每个只有一列,并且您在每个单元格的左上角之间绘制。如果有多列,则将零更改为要比较的列。你可能想要调整从左侧表格中间右侧的单元格到左侧表格中间左侧的点数。