java - IntelliJ GUI 表单未出现
问题描述
我正在使用 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
has 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);
这一堆代码将swing组件添加到mainPanel。执行第一行代码时,文本标签将添加到第一个网格中的 mainPanel。同样,第二行将类别添加到第二个网格,其余部分类似。
add(mainPanel);
这行代码将 mainPanel 添加到 Frame 中。
注意:我已经更改了标签的文本,如上图所示。
推荐阅读
- facebook-graph-api - 使用 facebook graph API 创建用户帖子
- sql - SQL左连接同一个表,但条件可能?
- mysql - 尝试使用过程输出记录,MySQL PL/SQL
- matrix - 从 2 行值输入创建 2 行矩阵或合并到其他文件时出现问题?
- javascript - Chrome 扩展:将用户输入字符串插入多个 declarativeNetRequest regexSubstitution 规则
- android - 如何通过从我自己的服务器下载 apk 并且没有来自 android 系统的用户提示来更新 react native android 应用程序?
- google-apps-script - 一些用户在尝试访问我的 Google 脚本时收到错误和奇怪的 URL。欢迎调试提示
- postgresql - gorm中不受支持的关系
- encoding - 编码和压缩的区别
- azure - 为什么在 Azure 静态 Web 应用中选择位置?