为什么此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个像素的另一个组件。 “递归”(如果您想以这种方式考虑)是不稳定的,并且无法获得稳定的解决方案。
我不知道删除这些消息的解决方案是什么,但是如果它没有在您的应用程序中引起异常的“抖动”(您会明白我的意思是),那么我就不必担心。这只是一条消息,表明它已放弃改正,因为它已重复出现多次。