为什么此SSCCE(带有MigLayout库)...

public static void main(String[] args) {

    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
        e.printStackTrace();
    }

    JFrame frame = new JFrame();
    frame.setLayout(new MigLayout(new LC().fill().insetsAll("0")));

    JTabbedPane jtp = new JTabbedPane();
    jtp.add(new JPanel(), "Tab 1");
    jtp.add(new JPanel(), "Tab 2");

    JLabel label = new JLabel("label");

    JPanel panel = new JPanel(new MigLayout(new LC().fill()));
    panel.add(jtp, "id tabbedpane, grow, span");
    panel.add(label, "pos (tabbedpane.w-label.w) 10, id label");
    label.setBounds(100, 100, 10, 10);

    frame.add(panel, "grow, span");
    frame.setSize(500, 500);
    frame.setLocationRelativeTo(null); // Sorry, Andrew Thompson
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

引发此错误:
Unstable cyclic dependency in absolute linked values!
Unstable cyclic dependency in absolute linked values!
Unstable cyclic dependency in absolute linked values!
Unstable cyclic dependency in absolute linked values!



我发现,如果删除了WindowsLookAndFeel代码,则一切运行正常...

因此,这是MigLayout和WindowsLookAndFeel的问题。但是我的实际应用程序需要使用它。

编辑:

这是引发错误时的框架外观:

最佳答案

看一下source code,这是因为它在进行布局时会更正组件的大小。如果它进行的计数超过* 8 + 10,那么它将使代码短路以防止无限循环。

相关的来源(删除了一些东西)是:

do {
    doAgain = false;
    for (Iterator<Cell> it = grid.values().iterator(); it.hasNext();) {
        ArrayList<CompWrap> compWraps = it.next().compWraps;
        for (int i = 0, iSz = compWraps.size(); i < iSz; i++) {
            CompWrap cw = compWraps.get(i);

            if (j == 0) {
                doAgain |= doAbsoluteCorrections(cw, bounds);
                // . . .
            }

            // . . .
        }
    }
    clearGroupLinkBounds();
    if (++count > ((compCount << 3) + 10)) {
        System.err.println("Unstable cyclic dependency in absolute linked values!");
        break;
    }

} while (doAgain);

因此发生的事情是,如果doAbsoluteCorrections返回true(在进行校正以满足大小相关性时,如果任何组件更改了大小,它都会执行此操作),那么它将重复循环,再次执行校正。您所看到的是当它重复太多次时打印的警告消息。由于更正会导致链接的组件的大小发生更改,因此您可能会遇到以下情况:更正为一个组件取消设置y值,为另一个组件设置y值,然后当第一个组件具有y值时设置后,它将取消设置另一个的y值,并重复进行直到我们用完重试为止。

Windows L&F对我来说经常会导致此问题,因为组件似乎总是会陷入这种情况,他们会进行此校正,并且只需要更改1个像素即可进行校正,但是这种校正导致它需要重做布局对于导致其向后移1个像素的另一个组件。 “递归”(如果您想以这种方式考虑)是不稳定的,并且无法获得稳定的解决方案。

我不知道删除这些消息的解决方案是什么,但是如果它没有在您的应用程序中引起异常的“抖动”(您会明白我的意思是),那么我就不必担心。这只是一条消息,表明它已放弃改正,因为它已重复出现多次。

09-27 18:42