繁体   English   中英

JLabel的文字没有改变

[英]JLabel's text is not changing

编辑:巨大的代码重组,旧问题在这里: http : //pastebin.com/Mbg4dYiY

我创建了一个基本程序,该程序旨在使用Swing在窗口中显示天气。 我正在使用IntelliJ进行开发,并且在其中使用了UI构建器。 我试图从Weather Underground服务器获取一些信息,然后使一个名为weatherlabel的JLabel显示此信息。 但是,JLabel实际上并未在窗口中更改; 它只是停留在“天气会在这里”。 我该如何解决?

这是我的main.java:

public class main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        Display d = new Display();
        d.getandsetWeather();
    }

}

这是我的Display.java:

public class Display {

    Display disp = this;

    public JPanel myPanel;
    public JLabel weatherfield;
    private JButton button1;

    public void init() {
        JFrame frame = new JFrame("Display");
        frame.setContentPane(new Display().myPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setMinimumSize(new Dimension(480, 234));
        frame.pack();
        frame.setVisible(true);
    }

    public void getandsetWeather() {
        String editedline = null;
        init();
        try {
            // Construct data
            String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
            data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");

            // Send data
            URL url = new URL("http://api.wunderground.com/api/772a9f2cf6a12db3/geolookup/conditions/q/UK/Chester.json");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String line;
            while ((line = rd.readLine()) != null) {

                if( line.contains("\"weather\":")) {
                    System.out.println(line);
                    editedline = line.replace("\"weather\":\"", "");
                    editedline = editedline.replace("\",", "");
                    System.out.println(editedline);
                    weatherfield.setText(editedline);
                }


            }
            wr.close();
            rd.close();
            weatherfield.setText(editedline);
            System.out.println(weatherfield.getText());
            weatherfield.repaint();
            weatherfield.revalidate();
        } catch (Exception e) {
            System.out.println("Error!" + e);
        }


    }

}

当我运行程序时,这将打印到日志中:

Hello World!
        "weather":"Scattered Clouds",
        Scattered Clouds
        Scattered Clouds
  1. 您似乎对OOP和代码流有一个奇怪的理解
  2. 您必须使用main方法,您要尝试调用其中一个main方法。 不要那样做 一个程序应该只有一种main方法。 永远都不必这样做

     Display.main(new String[]{}); 
  3. 为什么还要设置ChangeWeatherLabelText类? 只有一种方法,在它自己的类中似乎并不需要。 如果用该方法Display ,则实例化对程序的其余部分没有任何作用。 因此,您的呼叫对标签没有影响。

  4. 将该方法放到实际上具有标签的类中,而不是3,然后在该方法中引用标签字段。
  5. 另外, GetWeather似乎就像是带有帮助程序方法的帮助程序类。 如果“帮助程序”类方法不返回任何内容,则它们将无用。
  6. 恕我直言,您应该重组整个程序。 现在有些事情可能会奏效,但是您的代码中存在许多不良做法
  7. 如果我要编写此程序,则所有代码都在一个文件中。 如果您坚持将它们放在单独的文件中,则需要学习如何使用构造函数以及如何将对象传递给它们。 这就是您要操纵其他类中的对象的方式。 除非您了解MVC模型,否则此刻可能对您有所帮助。

更新的代码OP更新

测试一下,并确保阅读注释,以便您可以看到我的所作所为。 如果您有任何问题,请告诉我。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        new Display();                        // <-- just instantiate
    }

}

 class Display {

    Display disp = this;

    public JPanel myPanel;               // <--------- Haven't been initialized 
    public JLabel weatherfield;
    private JButton button1;

    public Display() {                   // you need constructor to call init
        init();
    }

    public void init() {
        myPanel = new JPanel(new BorderLayout());    // initialize
        weatherfield = new JLabel(" ");              // initialize
        button1 = new JButton("Button");              // initialize
        myPanel.add(weatherfield, BorderLayout.CENTER);
        myPanel.add(button1, BorderLayout.SOUTH);

        button1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                getandsetWeather();                       // <-------- add listener to call getandsetweather
            }
        });

        JFrame frame = new JFrame("Display");
        frame.setContentPane(myPanel);   //   <--------------------- fix 1
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setMinimumSize(new Dimension(480, 234));
        frame.pack();
        frame.setVisible(true);
    }

    public void getandsetWeather() {
        String editedline = null;
        init();
        try {
            // Construct data
            String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
            data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");

            // Send data
            URL url = new URL("http://api.wunderground.com/api/772a9f2cf6a12db3/geolookup/conditions/q/UK/Chester.json");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String line;
            while ((line = rd.readLine()) != null) {

                if( line.contains("\"weather\":")) {
                    System.out.println(line);
                    editedline = line.replace("\"weather\":\"", "");
                    editedline = editedline.replace("\",", "");
                    System.out.println(editedline);
                    weatherfield.setText(editedline);
                }


            }
            wr.close();
            rd.close();
            weatherfield.setText(editedline);
            System.out.println(weatherfield.getText());
            weatherfield.repaint();
            weatherfield.revalidate();
        } catch (Exception e) {
            System.out.println("Error!" + e);
        }


    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM