我正在使用IntelliJ制作一个简单的天气应用程序,并内置表单设计器。我制作并设计了一个表单,并相应地编辑了绑定的类文件。当我实际运行代码时,我设计的表单现在确实会显示出来,实际上,最后一行(maxtemp)是唯一显示在空白屏幕上的值。

PS:我正在使用Gradle进行构建,我还设置了GUI设计器以使用Java源代码而不是字节码(因为Gradle不支持字节码)

import org.json.JSONException;
import org.json.JSONObject;

import javax.swing.*;
import java.awt.*;


public class Frame extends JFrame {

// Get the API
private API api = new API();

// Form elements
public JPanel mainPanel;
public JLabel text;
public JLabel category;
public JLabel mintemp;
public JLabel maxtemp;
public JLabel link;


public Frame() throws Exception, JSONException {

    initFrame();

}

public void initFrame() throws Exception, JSONException {

    // Get API response
    JSONObject wjson = api.connection();

    // Filter response and get data
    String[] data = api.respFilter(wjson);


    // Swing components
    mainPanel = new JPanel(new BorderLayout());
    text = new JLabel();
    category = new JLabel();
    mintemp = new JLabel();
    maxtemp = new JLabel();
    link = new JLabel();


    // Add to the frame
    add(mainPanel);
    add(text);
    add(category);
    add(mintemp);
    add(maxtemp);


    text.setText(data[0]);
    category.setText(data[1]);
    mintemp.setText(data[3]);
    maxtemp.setText(data[4]);


}

public static void main(String[] args) throws Exception, JSONException {
    JFrame app = new Frame();
    app.setTitle("Java-WeatherApp");;
    app.setSize(900, 600);
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.setLocationRelativeTo(null);
    app.setVisible(true);
}

}


我是Java的新手,也是IntelliJ上的表单构建器的新手。不幸的是,我在表单生成器上找不到任何好的教程。任何帮助表示赞赏!

最佳答案

JFrame具有BorderLayout作为默认布局。

调用时,在initFrame()方法中,

add(mainPanel);
add(text);
add(category);
add(mintemp);
add(maxtemp);


您将所有摆动组件添加到JFrame。因为您没有指定组件的位置,并且由于JFrame具有BorderLayout,所以只有一个组件被添加到JFrame,这是您最后添加到组件的maxtemp Jlabel。

在添加到具有BorderLayout的JFrame时,应指定组件的位置,如下所示:

add(minTemp, BorderLayout.NORTH);


我建议您了解有关BorderLayout和LayoutManagers的更多信息。

要么,

您可以使用与此类似的代码,

// Swing components
mainPanel = new JPanel(new GridLayout(4, 1));
text = new JLabel();
category = new JLabel();
mintemp = new JLabel();
maxtemp = new JLabel();
link = new JLabel();

// Add to the mainPanel
mainPanel.add(text);
mainPanel.add(category);
mainPanel.add(mintemp);
mainPanel.add(maxtemp);

//Add mainPanel to Frame
add(mainPanel);


上面的代码执行以下操作:


mainPanel = new JPanel(new GridLayout(4, 1));这行代码将GridLayout设置为mainPanel的布局。 GridLayout是一种布局管理器,通过将容器(mainPanel)分为行和列,将其分为相等数量的网格。
在给定的代码中,我将mainPanel分为4行和1列,因此共有4个网格。

mainPanel.add(text);
mainPanel.add(category);
mainPanel.add(mintemp);
mainPanel.add(maxtemp);
这段代码将swing组件添加到mainPanel中。当执行第一行代码时,文本标签将添加到第一个网格中的mainPanel中。同样,第二行将类别添加到第二个网格,其余的类似。
add(mainPanel);这行代码将mainPanel添加到Frame。


如果执行了上面的代码,输出将类似于:
java - IntelliJ GUI表单未出现-LMLPHP

注意:如上图所示,我更改了标签的文本。

10-08 18:50