【问题标题】:IntelliJ GUI Form not appearingIntelliJ GUI 表单未出现
【发布时间】:2019-03-04 02:42:12
【问题描述】:

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

P.S我是用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 上的表单构建器也很陌生。不幸的是,我在表单生成器上找不到任何好的教程。任何帮助表示赞赏!

【问题讨论】:

  • 请检查youtrack.jetbrains.com/issue/IDEA-207997是不是这样。
  • 首先将How to use BorderLayout 视为JFrame,默认情况下使用BorderLayout。接下来,放下表单编辑器,腾出时间手工编写一些 UI 代码,它会让你更好地理解这些问题并修复它们
  • @MadProgrammer 我之前制作了一个从头开始构建 GUI 的应用程序,我只是在尝试使用表单编辑器。如果我对此一无所获,我只能求助于手动制作。

标签: java swing intellij-idea formbuilder swingbuilder


【解决方案1】:

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(文本); mainPanel.add(类别); mainPanel.add(mintemp); mainPanel.add(maxtemp);

  • 这组代码将摆动组件添加到主面板。执行第一行代码时,文本标签将添加到第一个网格中的 mainPanel。同样,第二行将类别添加到第二个网格中,其余部分类似。

  • add(mainPanel);这行代码将mainPanel添加到Frame中。

如果您执行上述代码,输出将类似于,

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

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多