1

現在、スプリットパネル付きのフレームで構成されるスイングアプリケーションに取り組んでいます。左側のパネルには、世界のすべての国を一覧表示するjtreeがあり、右側のパネルには、起動時のマップを示すOpenStreetMapがあります(これは機能します)。jtreeのノードは、valueChanged(..)イベントハンドラーにリンクされています。

/** Required by TreeSelectionListener interface. */
public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

    mapPanel = drawOpenStreetMap(45, 65, 12);
    mapPanel.repaint();
    repaint();
    splitPane.repaint();
    repaint();
    updateUI();
}

MapPanel drawOpenStreetMap(double lon, double lat, int zoom) {
    mapPanel = new MapPanel(); // just a JPanel extension, add to any swing/awt container
    mapPanel.setZoom(zoom); // set some zoom level (1-18 are valid)
    Point position = mapPanel.computePosition(new Point2D.Double(lon, lat));
    mapPanel.setCenterPosition(position); // sets to the computed position
    mapPanel.repaint(); // if already visible trigger a repaint here
    return mapPanel;
}

jtreeノードをクリックするとvalueChangedメソッドが呼び出され、drawOpenStreetMapが実際に呼び出され、マップが更新されて新しい場所が表示されることを期待していました。しかし、何も変わりません。起動時に作成されたマップは変更されずに表示されたままになります。valueChangeメソッドのコードは、repaint()呼び出しなどの数を示しています。私が試しましたが、役に立ちませんでした。

MapPanelソースコードへのポインタは次のとおりです。

誰かが地図を更新する方法を教えてくれたら素晴らしいと思います。前もって感謝します!

追記:間違ったMapPanelを参照しました。これでなければなりませ

4

1 に答える 1

1

SplitPanelメソッドのように、作成したMapPanelインスタンスを親コンテナに追加しなかったようですvalueChanged()

valueChanged()メソッドが呼び出されたら、メソッドを呼び出しdrawOpenStreetMap()てインスタンスを作成しますが、MapPanelインスタンスをに追加しませんでしたSplitPanel。そのため、地図の新しい場所は表示されませんでした。おそらく、次のようなコードを挿入する必要があります。

public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

    mapPanel = drawOpenStreetMap(45, 65, 12);
    rightPanel.add(mapPanel); // rightPanel is the panel in the right side of split pane.
    ... 
于 2012-07-24T21:49:21.997 に答える