【发布时间】:2017-10-29 17:24:13
【问题描述】:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import javax.swing.*;
import java.awt.*;
public class AWG_Widget extends JPanel {
public static final int mapWidth = 300;
public static final int mapHeight = 300;
BorderLayout layout = new BorderLayout();
JPanel northPanel, centerPanel;
JButton bt_GetMap;
//Holds the map
JLabel map;
ImageIcon mapIcon;
// Combo Box for the types of maps: roadmap, satellite, terrain
String[] mapTypesStringArray = {"roadmap","satellite","terrain"};
String selectedMapType = "satellite";
JComboBox mapTypesComboBox = new JComboBox(mapTypesStringArray);
public AWG_Widget(){
// Set layout
setLayout(layout);
// Sets a border around the pane
this.setBorder(BorderFactory.createEtchedBorder());
// inits panels
northPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
// Creates components
try {
createMap();
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
bt_GetMap = new JButton("Get Map!");
// Add components to panels
try{
createMap();
}
catch(IOException e){
System.out.println("Bad output");
}
northPanel.add(mapTypesComboBox);
northPanel.add(bt_GetMap);
// Add panels to layout
add(northPanel, BorderLayout.NORTH);
add(centerPanel, BorderLayout.CENTER);
// Add Listeners
mapTypesComboBox.addItemListener(new ComboBoxItemListener());
bt_GetMap.addActionListener(new ButtonListener());
}
public void createMap() throws IOException{
String imageUrl = "https://maps.googleapis.com/maps/api/staticmap?center=10,-11.998672&zoom=6&size=612x612&scale=5&maptype=" + selectedMapType + "";
String destinationFile = "image.jpg";
String str = destinationFile;
URL url = new URL(imageUrl);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destinationFile);
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
mapIcon = new ImageIcon((new ImageIcon("image.jpg")).getImage().getScaledInstance(mapWidth, mapHeight,
java.awt.Image.SCALE_SMOOTH));
map = new JLabel(mapIcon);
centerPanel.add(map);
}
// Item Listener Class
class ComboBoxItemListener implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED){
if(e.getItem().equals("roadmap")){
selectedMapType = "roadmap";
}
if(e.getItem().equals("satellite")){
selectedMapType = "satellite";
}
if(e.getItem().equals("terrain")){
selectedMapType = "terrain";
}
}
}
}
class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try{
centerPanel.remove(map);
remove(centerPanel);
repaint();
revalidate();
createMap();
add(centerPanel, BorderLayout.CENTER);
revalidate();
repaint();
}
catch(IOException ex){
System.out.println("Bad map");
}
catch(InterruptedException ex){
System.out.println("Bad map");
}
}
}
}
所以我要从面板中删除组件,并从主面板中删除子面板。我可以让图像消失,但是当我调用创建新图像的方法时,我无法让它重新显示。
我知道它会创建一个新的图像文件,因为我可以在文件夹中手动检查它。
为什么这不起作用?
预期行为:程序有一个下拉框,其中包含 Google 提供的三种类型的地图。我想选择一张地图,然后点击获取地图按钮。
该按钮调用 get map 函数,该函数创建一个 jlabel,其中包含从 Google 地图 url 创建的图像图标。
我只是想让程序删除旧图像并添加更新后的图像。
观察到的行为:我可以删除旧图像并调用 create map 函数。该程序感觉就像它挂了一个分秒,我认为它正在下载新图像,但它实际上并没有更新图像。
我知道它正在正确下载图像,因为我可以在目录文件夹中手动检查它。
【问题讨论】:
-
请详细说明 -- 该程序的预期行为是什么?观察到的行为是什么?什么具体正在发生而不应该发生?什么具体没有发生而应该发生?您的代码中最相关的部分是什么,您能否详细描述它应该做什么?
-
@HovercraftFullOfEels 谢谢和抱歉。我编辑了我的帖子。
-
我不会重新创建您的 JLabel。而是创建一个 JLabel 字段来保存图标,并在需要时通过在该 JLabel 上调用
.setIcon(...)来简单地交换图标。尽可能简单。 -
否则,您需要使用您创建的每个新 JLabel 调用
revaludate()和repaint()。但同样,不要为此烦恼。只需交换图标。 -
请参阅编辑回答。
标签: java google-maps jpanel jlabel