0

私は大学生で、NetBeans IDE 7.4 と Swing GUI を使用して Java 天気予報アプリ (実行可能 JAR) を作成しています。私は今のところ Java について非常に限られた知識しか持っていません。GUI パネルに初めて画像をロードする際に問題があります (つまり、jFrame 1 の jButton をクリックした後に開いた別の jFrame に 2 番目以降の画像をロードする際に問題が発生します)。getResource() 、 ImageIcon を含むいくつかのメソッドを試し、Java 2-D ドキュメントの例も試しました。

ImageIcon で部分的に成功しましたが、1 つの画像を読み込んだ後、他の画像を読み込めません。表示される後続の画像は以前と同じで、変更はありません。getImageLoadStatus() で診断すると、接続の問題を示している可能性がある値「8」が返されます。URL から画像をロードする必要があります。具体的には、Yahoo 天気 RSS フィードを使用して、画像を含むプログラムのすべてを実装しています。

私がまったく困惑しているのは、同じコードが同じコンテキストで使用された場合に異なる動作をすることです (この場合は動作しません)。さらに明確にするために、以下の 2 つのコード スニペットを確認してください。

PSデータを取得するためのJSON / XML解析がわからないので、使用したのは非常に単純なURLから文字列へのメソッドです。

最初の jFrame での作業コード >

 // TO GET CODE
        num = weather.indexOf("code");
        num1 = weather.indexOf(" ", num);
        String cod = weather.substring(num + 6, num1 - 1);

        String imgurl = "http://l.yimg.com/a/i/us/we/52/" + cod;
        String imgurl1 = imgurl + ".gif";
        System.out.println(imgurl1);

 // TO DISPLAY IMAGE 
        try{
         BufferedImage img = ImageIO.read(new URL(imgurl1));

      jLabel19.setIcon(new ImageIcon(img)); 
        }
        catch(Exception e){

        }

-- jFrame 1 のボタンをクリックすると開く 2 番目の jFrame の非動作コード (

   // TO GET CODE
    num = weather_1.indexOf("day");
    num1 = weather_1.indexOf("code", num);
    num2 = weather_1.indexOf("/", num1);
    String cod = weather_1.substring(num1 + 6, num2 - 2);

    String imgurl = "http://l.yimg.com/a/i/us/we/52/" + cod;
    String imgurl1 = imgurl + ".gif";

        //TO GET IMAGE
     try{
     BufferedImage img = ImageIO.read(new URL(imgurl1));
   System.out.println(imgurl1);

    jLabel16.setIcon(new ImageIcon(img)); 
    }
    catch(Exception e){

    }

私がまったく困惑しているのは、変数「imgurl1」を「http://l.yimg.com/a/i/us/we/52/30.gif」という URL 形式に変更すると、それは正常に動作します。しかし、「(new URL(imgurl1));」内に変数を含むコード コードはjFrame 1で初めて機能しました。

4

1 に答える 1

2

そこで、http://weather.yahooapis.com/forecastrss?w=1103816&u=cを見て、返される内容を確認し、次の出力を得ました...

<?xml version="1.0" encoding="UTF-8"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" version="2.0">
    <channel>

        <title>Yahoo! Weather - Melbourne, AU</title>
        <link>http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html</link>
        <description>Yahoo! Weather for Melbourne, AU</description>
        <language>en-us</language>
        <lastBuildDate>Sun, 02 Mar 2014 1:29 pm AEDT</lastBuildDate>
        <ttl>60</ttl>
        <yweather:location city="Melbourne" country="Australia" region="VIC"/>
        <yweather:units distance="km" pressure="mb" speed="km/h" temperature="C"/>
        <yweather:wind chill="21" direction="190" speed="19.31"/>
        <yweather:atmosphere humidity="46" pressure="1015.92" rising="0" visibility="9.99"/>
        <yweather:astronomy sunrise="7:03 am" sunset="7:57 pm"/>
        <image>
            <title>Yahoo! Weather</title>
            <width>142</width>
            <height>18</height>
            <link>http://weather.yahoo.com</link>
            <url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url>
        </image>
        <item>
            <title>Conditions for Melbourne, AU at 1:29 pm AEDT</title>
            <geo:lat>-37.87</geo:lat>
            <geo:long>145.1</geo:long>
            <link>http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html</link>
            <pubDate>Sun, 02 Mar 2014 1:29 pm AEDT</pubDate>
            <yweather:condition code="28" date="Sun, 02 Mar 2014 1:29 pm AEDT" temp="21" text="Mostly Cloudy"/>
            <description><![CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/28.gif"/><br />
<b>Current Conditions:</b><br />
Mostly Cloudy, 21 C<BR />
<BR /><b>Forecast:</b><BR />
Sun - AM Clouds/PM Sun. High: 22 Low: 12<br />
Mon - Partly Cloudy. High: 27 Low: 14<br />
Tue - Mostly Sunny. High: 32 Low: 19<br />
Wed - AM Light Rain. High: 21 Low: 12<br />
Thu - Partly Cloudy. High: 22 Low: 13<br />
<br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Melbourne__AU/*http://weather.yahoo.com/forecast/ASXX0075_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
]]></description>
            <yweather:forecast code="30" date="2 Mar 2014" day="Sun" high="22" low="12" text="AM Clouds/PM Sun"/>
            <yweather:forecast code="30" date="3 Mar 2014" day="Mon" high="27" low="14" text="Partly Cloudy"/>
            <yweather:forecast code="34" date="4 Mar 2014" day="Tue" high="32" low="19" text="Mostly Sunny"/>
            <yweather:forecast code="11" date="5 Mar 2014" day="Wed" high="21" low="12" text="AM Light Rain"/>
            <yweather:forecast code="30" date="6 Mar 2014" day="Thu" high="22" low="13" text="Partly Cloudy"/>
            <guid isPermaLink="false">ASXX0075_2014_03_06_7_00_AEDT</guid>
        </item>
    </channel>
</rss><!-- fan516.sports.gq1.yahoo.com Sun Mar  2 03:08:38 PST 2014 -->

このあたりで、コンテンツを読み取るだけでなく、クエリも実行できる API が利用できる場合を除いて、それを解析しようとする方法はまったくないだろうと思いました。

だから私はこの簡単なテストを書きました...

RSS フィードを読み取り、目的の情報を含むパスdescriptionから要素を見つけます。/rss/channel/item

次に、説明の内容を HTML 形式で解析する必要があります。これにより、imgタグの検索とsrc画像への属性の抽出が容易になりました。

最後にJOptionPane、アイコンを示す表示を表示しました...

天気

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class YahooTest {

    public static void main(String[] args) {
        Document doc = null;
        try {
            URL url = new URL("http://weather.yahooapis.com/forecastrss?w=1103816&u=c");
            Node descNode = getNodeFrom(url, "/rss/channel/item/description");

            if (descNode != null) {

                String desc = descNode.getTextContent();
                System.out.println(desc);

                desc = "<root>" + desc + "</root>";
                Node imgSourceNode = getNodeFrom(desc, "/root/img[@src]");
                if (imgSourceNode != null) {
                    String imgUrl = imgSourceNode.getAttributes().getNamedItem("src").getNodeValue();
                    BufferedImage img = ImageIO.read(new URL(imgUrl));
                    JOptionPane.showMessageDialog(
                                    null,
                                    "The Weather looks like...",
                                    "Weather",
                                    JOptionPane.PLAIN_MESSAGE,
                                    new ImageIcon(img));
                } else {
                    JOptionPane.showMessageDialog(null, "No image source found in description");
                }

            } else {
                JOptionPane.showMessageDialog(null, "No description node found");
            }           
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static Node getNodeFrom(URL url, String query) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {

        Node node = null;
        InputStream is = null;
        try {
            is = url.openStream();
            node = getNodeFrom(is, query);
        } finally {
            try {
                is.close();
            } catch (Exception e) {
            }
        }

        return node;

    }

    public static Node getNodeFrom(String text, String query) throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {

        Node node = null;
        InputStream is = null;
        try {
            is = new ByteArrayInputStream(text.getBytes());
            node = getNodeFrom(is, query);
        } finally {
            try {
                is.close();
            } catch (Exception e) {
            }
        }

        return node;

    }

    public static Node getNodeFrom(InputStream is, String query) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
        return getNodeFrom(doc, query);
    }

    public static Node getNodeFrom(Document doc, String query) throws XPathExpressionException {
        return getNodeFrom(doc.getDocumentElement(), query);
    }

    public static Node getNodeFrom(Node node, String query) throws XPathExpressionException {
        XPath xPath = XPathFactory.newInstance().newXPath();
        XPathExpression xExp = xPath.compile(query);
        return (Node) xExp.evaluate(node, XPathConstants.NODE);
    }

}

私はあなたのコードを調べるのに時間を費やしましたが、変数の命名の選択が不十分で、何が起こっているのかを理解することはほぼ不可能でした...

http://docs.oracle.com/javase/tutorial/jaxp/XPath の仕組みXPath チュートリアルをご覧ください。

于 2014-03-02T03:16:32.137 に答える