0

私が作っているプラ​​イベートゲーム用の小さなアニメーション/xmlファイル作成エディターをやっています。いくつかのカスタム コンポーネントを追加する JPanel がありますが、何の変化も見られません。

カスタム コンポーネント:

public class BasicProprety extends JPanel {
String key;
String value;

    public BasicProprety(String k, String v) {
        key = k;
        value = v;
        JTextField keyField = new JTextField(k);
        JTextField valueField = new JTextField(v);
        valueField.setVisible(true);
        keyField.setVisible(true);
        this.add(keyField);
        this.add(valueField);
        this.setVisible(true);
    }
}

静的メソッドを使用して、現在のフレームのプロパティを更新します。

 public static void refreshFrameProperties() {
    Frame currentFrame = DataBank.getCurrentInstance().getCurrentFrameObj();
    BasicProprety millisecs = new BasicProprety("millisecondsTillNextFrame", String.valueOf(currentFrame.getMillisecondsToNextFrame()));
    BasicProprety offsetX = new BasicProprety("offsetX", String.valueOf(currentFrame.getOffset().x));
    BasicProprety offsetY = new BasicProprety("offsetY", String.valueOf(currentFrame.getOffset().y));
    BasicProprety sizeX = new BasicProprety("sizeX", String.valueOf(currentFrame.getSize().x));
    BasicProprety sizeY = new BasicProprety("sizeY", String.valueOf(currentFrame.getSize().y));
    sizeX.revalidate();
    sizeY.revalidate();
    offsetY.revalidate();
    offsetX.revalidate();
    millisecs.revalidate();
    sizeX.repaint();
    sizeY.repaint();
    offsetY.repaint();
    offsetX.repaint();
    millisecs.repaint();
    ArrayList<BasicProprety> basicList = new ArrayList<BasicProprety>();
    for (int i = 0; i < mainInterface.getProperties().getComponentCount(); i++) {
        if (mainInterface.getProperties().getComponent(i) instanceof BasicProprety)
            basicList.add((BasicProprety)mainInterface.getProperties().getComponent(i));
    }
    for (BasicProprety bp : basicList) {
        mainInterface.getProperties().remove(bp);
    }
    mainInterface.getProperties().revalidate();
    mainInterface.getProperties().repaint();
    System.out.println("REMOVED: "+mainInterface.getProperties().getComponentCount());
    mainInterface.getProperties().getLayout().addLayoutComponent("TEST", sizeY);
    mainInterface.getProperties().add(millisecs);
    mainInterface.getProperties().add(offsetX);
    mainInterface.getProperties().add(offsetY);
    mainInterface.getProperties().add(sizeX);
    mainInterface.getProperties().add(sizeY);
    /*Random r = new Random();
    mainInterface.getProperties().setBackground(new Color(r.nextInt()));*/
    mainInterface.getProperties().revalidate();
    mainInterface.getProperties().repaint();
    mainInterface.getProperties().setVisible(true);
    System.out.println("NO: "+mainInterface.getProperties().getComponentCount());

}

コンポーネントは netbeans インターフェイス エディタで作成され、これが作成コードです。

    properties = new javax.swing.JPanel();
    org.jdesktop.layout.GroupLayout propertiesLayout = new org.jdesktop.layout.GroupLayout(properties);
    properties.setLayout(propertiesLayout);
    propertiesLayout.setHorizontalGroup(
        propertiesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 243, Short.MAX_VALUE)
    );
    propertiesLayout.setVerticalGroup(
        propertiesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 386, Short.MAX_VALUE)
    );
4

2 に答える 2

1

それらはおそらく追加されますが、あなたComponentではなくcontentPaneに追加されます。JPanel.getContentPane()これは、 の唯一無二のコンポーネントですJPanel

よくわかりません。

于 2012-08-08T18:42:12.187 に答える
0

mainInterface.getComponentCount()コンポーネント数のエラーは、 ではなくをチェックしていることですmainInterface.getProperties().getComponentCount()。おそらくmainInterfaceあなたのJPanel

ローカル変数を使用すると、これらと同様のエラーを回避できます。

final JPanel properties = mainInterface.getProperties();
...
System.out.println("number of properties' components: "
                       + properties.getComponentCount());

ところで、次のループを単純化できます...

ArrayList<BasicProprety> basicList = new ArrayList<BasicProprety>();
for (int i = 0; i < mainInterface.getProperties().getComponentCount(); i++) {
    if (mainInterface.getProperties().getComponent(i) instanceof BasicProprety)
        basicList.add((BasicProprety)mainInterface.getProperties().getComponent(i));
}
for (BasicProprety bp : basicList) {
    mainInterface.getProperties().remove(bp);
}

...これに:

for (Component component : properties.getComponents()) {
  if (component instanceof BasicProperty) {
    properties.remove(component);
  }
}

すべての UI の変更がイベント ディスパッチ スレッドのコンテキストで行われていることを確認してください。

(PSを何らかのContainer方法で公開する必要があると考える人は他にいますIterator<Component>か?)

于 2012-08-08T18:48:38.490 に答える