【问题标题】:JMapViewer in NetBeans: adding only map to a GUI JPanelNetBeans 中的 JMapViewer:仅将地图添加到 GUI JPanel
【发布时间】:2016-08-12 22:41:18
【问题描述】:

我正在尝试学习JMapViewer,并在JPanel 中嵌入了一张地图,它是CardLayout 的一部分。此时,我只想显示一个不带缩放、鼠标操作侦听器等的地图。因此,我在 NetBeans 中创建了一个带有CardLayout 和多个JPanels 的GUI 框架。在其中一个面板中,我添加了另一个面板,该面板应位于地图所在的位置。然后我添加了JMapViewer.jarJMapViewer_src.jar。然后我添加了以下简单代码:

package viewController;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.events.JMVCommandEvent;
import org.openstreetmap.gui.jmapviewer.interfaces.JMapViewerEventListener;

public class PanelAcars extends javax.swing.JPanel implements JMapViewerEventListener  
{

    public PanelAcars() 
    {
        super();

        setSize(400,400);

        initComponents();

        final JMapViewer map = new JMapViewer();

        pnlAcarsMapView.add(map);

    }


    @Override
    public void processCommand(JMVCommandEvent command) {
        if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) ||
                command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) {
            //updateZoomParameters();
        }
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          

     private void initComponents() {

        pnlAcarsMapView = new javax.swing.JPanel();

        ...
    }                        

    private javax.swing.JPanel pnlAcarsMapView;

}

面板是空的。我有Demo.java 代码,如果我简单地将它复制并粘贴到一个新项目中,它就可以工作。但我想从构建一个简单的地图并将其添加到我的面板开始对其进行修改。我错过了什么?

谢谢!

【问题讨论】:

    标签: java swing cardlayout jmapviewer


    【解决方案1】:

    没有一个完整的例子,不清楚你的程序哪里出错了。常见问题包括:

    • 将地图添加到意外容器。

    • 在调用pack() 之后添加地图,而不重新验证容器。

    一般来说,通过限制 GUI 编辑器的范围来避免此类问题,建议 here。在下面的示例中,CardPanel 的实例被添加到具有CardLayoutJPanel

    cards.add(new CardPanel("London", new Coordinate(51.5072, -0.1275)));
    cards.add(new CardPanel("Paris", new Coordinate(48.8566, 2.3522)));
    

    每个此类实例都有一个GridLayout,但您可以替换为BorderLayout 并尝试将地图添加到CENTER 和周围区域的其他组件中。

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import org.openstreetmap.gui.jmapviewer.Coordinate;
    import org.openstreetmap.gui.jmapviewer.JMapViewer;
    
    /**
     * @see https://stackoverflow.com/a/38934376/230513
     * @see https://stackoverflow.com/a/36392696/230513
     * @see https://stackoverflow.com/a/36243395/230513
     */
    public class CardPanel extends JPanel {
    
        private static final JPanel cards = new JPanel(new CardLayout());
        private final String name;
    
        public CardPanel(String name, Coordinate coordinate) {
            super(new GridLayout());
            this.name = name;
            JMapViewer map = new JMapViewer() {
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(320, 240);
                }
            };
            map.setDisplayPosition(coordinate, 12);
            this.add(map);
        }
    
        @Override
        public String toString() {
            return name;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    create();
                }
            });
        }
    
        private static void create() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cards.add(new CardPanel("London", new Coordinate(51.5072, -0.1275)));
            cards.add(new CardPanel("Paris", new Coordinate(48.8566, 2.3522)));
            JPanel control = new JPanel();
            control.add(new JButton(new AbstractAction("\u22b2Prev") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout) cards.getLayout();
                    cl.previous(cards);
                }
            }));
            control.add(new JButton(new AbstractAction("Next\u22b3") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout) cards.getLayout();
                    cl.next(cards);
                }
            }));
            f.add(cards, BorderLayout.CENTER);
            f.add(control, BorderLayout.SOUTH);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }
    

    【讨论】:

    • 非常感谢。很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2012-08-30
    • 2012-05-24
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多