0

SpringLayout のドキュメントには、Java 1.4 以降で利用可能であると書かれています。私は、Mac OS 10.5 の新しいバージョンにアップグレードできない 7 台の古い Mac を持っているため、せいぜい Java 1.5.0_30 しか持っていません。問題は、Spring レイアウトで動作するアプリがあり、常にこのスタック バック トレースを取得していることです。

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 があることを発見しましたが、SOUTH で VERTICAL_LAYOUT を使用することはできません。どうしてか分かりません。

更新 2: Ian の指示に従って、次のコードを実行しましたが、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.getConstraint(SpringLayout.HEIGHT, myImage)springLayout.getConstraints(myImage).getHeight()、完全に正常に機能しました。:)

4

1 に答える 1

2

制約タイプはJava 6で導入されたVERTICAL_CENTERため、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)

したがって、現在設定SOUTHしていて、高さをサイズのスプリングにVERTICAL_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));
于 2014-02-01T19:36:05.420 に答える