Springlayout不用在Java 5(Mac)Vertical_center上工作



Springlayout的文档说自Java 1.4以来可用,我喜欢7个旧的Mac,可以升级到任何较新版本的Mac OS 10.5,这使我有最多只有Java 1.5.0_30。问题是我有一个可与春季布局一起使用的应用程序,并且我总是会得到此堆栈的回调跟踪:

Exception in thread "main" java.lang.NullPointerException
at javax.swing.SpringLayout$SpringProxy.getValue(SpringLayout.java:674)
at javax.swing.Spring$CompoundSpring.getValue(Spring.java:420)
at javax.swing.Spring$CompoundSpring.getValue(Spring.java:420)
at javax.swing.SpringLayout.layoutContainer(SpringLayout.java:1004)
at java.awt.Container.layout(Container.java:1401)
at java.awt.Container.doLayout(Container.java:1390)
at java.awt.Container.validateTree(Container.java:1473)
at java.awt.Container.validateTree(Container.java:1480)
at java.awt.Container.validateTree(Container.java:1480)
at java.awt.Container.validateTree(Container.java:1480)
at java.awt.Container.validateTree(Container.java:1480)
at java.awt.Container.validate(Container.java:1448)
at java.awt.Window.show(Window.java:516)
at java.awt.Component.show(Component.java:1317)
at java.awt.Component.setVisible(Component.java:1270)

是否有任何解决方案,有罐子或类似的东西?

请避免诸如"升级您的计算机"之类的答案

更新:我认为Java上有Springlayout,但是您不能将vertical_layout与South一起使用。我不知道为什么。

更新2:按照Ian I的指示执行以下代码,并且它仍然无法在Java 5上使用

springLayout.putConstraint(SpringLayout.NORTH, myImage, 
            Spring.sum(springLayout.getConstraint(SpringLayout.SOUTH, myPanel) ,
                    Spring.sum(Spring.scale(Spring.minus(springLayout.getConstraint(SpringLayout.HEIGHT, myImage)),0.5f),
                            Spring.scale(Spring.minus(springLayout.getConstraint(SpringLayout.HEIGHT, myPanel)),0.5f)
                    )
             ), SpringLayout.NORTH, myPanel);

更新3:用springLayout.getConstraints(myImage).getHeight()替换springLayout.getConstraint(SpringLayout.HEIGHT, myImage),它的工作正常。:)

VERTICAL_CENTER约束类型是由Java 6介绍的,这就是为什么它在Java 5中对您不起作用的原因。

VERTICAL_CENTER = NORTH + HEIGHT/2
SOUTH = NORTH + HEIGHT

替换和重新安排这些方程式,我们得到

                     NORTH = SOUTH - HEIGHT
           VERTICAL_CENTER = SOUTH - HEIGHT/2
VERTICAL_CENTER + HEIGHT/2 = SOUTH
                  HEIGHT/2 = SOUTH - VERTICAL_CENTER
                    HEIGHT = 2*(SOUTH - VERTICAL_CENTER)

因此,如果您当前正在设置SOUTHVERTICAL_CENTER,则可以通过将高度设置为尺寸2*(SOUTH - VERTICAL_CENTER)的弹簧来实现相同的效果。所以替换

constr.putConstraint(SpringLayout.SOUTH, southSpring);
constr.putConstraint(SpringLayout.VERTICAL_CENTER, vcSpring);

constr.putConstraint(SpringLayout.SOUTH, southSpring);
constr.setHeight(
  Spring.scale(Spring.sum(southSpring, Spring.minus(vcSpring)),
               2.0f));

最新更新