java - Java 结构 JFrame GUI
问题描述
在我学徒的第一年,我是一名计算机科学家。
一开始我们从过程式Java编程开始,现在我们必须学习面向对象的Java。首先,我们必须编写一个带有一些特性的 GUI 和一些东西来保存一些字符串,比如在数据库中。反正我还没到。我仍然坚持创建和构建 GUI。它里面有它需要的一切,但我试图得到的结构并没有真正起作用。
所以这就是我得到的:
测试GUI.Java
import javax.swing.*;
public class TestGui {
public static void main(String[] args){
ModulGui GUI = new ModulGui();
ImageIcon img = new ImageIcon("icon.png");
GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GUI.setSize(250,350);
GUI.setIconImage(img.getImage());
GUI.setLocationByPlatform(true);
GUI.setResizable(false);
GUI.setVisible(true);
}
}
ModulGui.java
import javax.swing.*;
import java.awt.*;
import java.security.PrivateKey;
public class ModulGui extends JFrame {
private final JLabel LabelModulID;
private final JLabel LabelModulName;
private final JLabel LabelStartDatum;
private final JTextField TextFeldModulId;
private final JTextField TextFeldModulName;
private final JTextField TextFeldStartDatum;
private final JButton ButtonHinzufuegen;
private final JButton ButtonEntfernen;
private final JButton ButtonAlleAusgeben;
public ModulGui(){
super("Modulliste");
setLayout(new FlowLayout());
GridBagConstraints GuiGrid = new GridBagConstraints();
LabelModulID = new JLabel("Modul ID");
LabelModulID.setToolTipText("Bitte Modul ID eintragen.");
GuiGrid.gridx = 0;
GuiGrid.gridy = 1;
add(LabelModulID);
LabelModulName = new JLabel("Modulname");
LabelModulName.setToolTipText("Bitte Modulnamen eintragen");
GuiGrid.gridx = 0;
GuiGrid.gridy = 2;
add(LabelModulName);
LabelStartDatum = new JLabel("Startdatum");
LabelStartDatum.setToolTipText("Startdatum des Moduls eintragen");
GuiGrid.gridx = 0;
GuiGrid.gridy = 3;
add(LabelStartDatum);
TextFeldModulId = new JTextField(25);
GuiGrid.gridx = 0;
GuiGrid.gridy = 4;
add(TextFeldModulId);
TextFeldModulName = new JTextField(25);
GuiGrid.gridx = 0;
GuiGrid.gridy = 5;
add(TextFeldModulName);
TextFeldStartDatum = new JTextField(25);
GuiGrid.gridx = 0;
GuiGrid.gridy = 6;
add(TextFeldStartDatum);
ButtonHinzufuegen = new JButton("Hinzufügen");
GuiGrid.gridx = 0;
GuiGrid.gridy = 7;
add(ButtonHinzufuegen);
ButtonEntfernen = new JButton("Entfernen");
GuiGrid.gridx = 0;
GuiGrid.gridy = 8;
add(ButtonEntfernen);
ButtonAlleAusgeben = new JButton("Alle Ausgeben");
GuiGrid.gridx = 0;
GuiGrid.gridy = 9;
add(ButtonAlleAusgeben);
}
}
抱歉,也许问题真的很简单,但就像我说的我对编程很陌生 :D 我也用 setBounds 和 setLayout(null) 尝试过......好吧也没有真正起作用。
我想将我的代码结构如下:
LabelModulID
TextFeldModulID
LabelModulName
TextFeldModulName
LabelStartDatum
TextFeldStartDatum
ButtonHinzufuegen
ButtonEntfernen
ButtonAlleAusgeben
你们知道我该怎么做吗?
有人知道我如何使用对象或其他东西来存储一些模块(模块),比如在数据库中。就像类 Modulelist 和 Module。
先谢谢各位了!!
//编辑//
这就是我在你的帮助下得到的新代码。看起来不太好,但第二次尝试也不错:
import javax.swing.*;
import java.awt.*;
import java.security.PrivateKey;
public class ModulGui extends JFrame {
public final JPanel panelModulID = new JPanel();
public final JPanel panelModulName = new JPanel();
public final JPanel panelStartDatum = new JPanel();
public final JPanel panelButtons = new JPanel();
private final JLabel LabelModulID;
private final JLabel LabelModulName;
private final JLabel LabelStartDatum;
private final JTextField TextFeldModulId;
private final JTextField TextFeldModulName;
private final JTextField TextFeldStartDatum;
private final JButton ButtonHinzufuegen;
private final JButton ButtonEntfernen;
private final JButton ButtonAlleAusgeben;
public ModulGui(){
super("Modulliste");
setLayout(new FlowLayout(FlowLayout.CENTER));
LabelModulID = new JLabel("Modul ID");
LabelModulID.setToolTipText("Bitte Modul ID eintragen.");
panelModulID.add(LabelModulID);
LabelModulName = new JLabel("Modulname");
LabelModulName.setToolTipText("Bitte Modulnamen eintragen");
panelModulName.add(LabelModulName);
LabelStartDatum = new JLabel("Startdatum");
LabelStartDatum.setToolTipText("Startdatum des Moduls eintragen");
panelStartDatum.add(LabelStartDatum);
TextFeldModulId = new JTextField(25);
panelModulID.add(TextFeldModulId);
TextFeldModulName = new JTextField(25);
panelModulName.add(TextFeldModulName);
TextFeldStartDatum = new JTextField(25);
panelStartDatum.add(TextFeldStartDatum);
ButtonHinzufuegen = new JButton("Hinzufügen");
panelButtons.add(ButtonHinzufuegen);
ButtonEntfernen = new JButton("Entfernen");
panelButtons.add(ButtonEntfernen);
ButtonAlleAusgeben = new JButton("Alle Ausgeben");
panelButtons.add(ButtonAlleAusgeben);
add(panelModulID);
add(panelModulName);
add(panelStartDatum);
add(panelButtons);
}
}
解决方案
好的,我会尝试用一个布局管理器来做......你用的是哪一个?我会尝试使用
GroupLayout
.
啊,这是一个常见的错误。很少(如果有的话)使用单一布局创建好的布局。相反,我们通常将它们组合起来以创建所需的 GUI。
以这种布局为例:
它使用 aGridBagLayout
作为“外部”部分,然后在 GBL 的最后一行放置一个 ( JPanel
with a)FlowLayout
来保持按钮。
这是用于将其组合在一起的代码:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class GUILayout {
private JComponent ui = null;
GUILayout() {
initUI();
}
public final void initUI() {
if (ui!=null) return;
ui = new JPanel(new GridBagLayout());
ui.setBorder(new EmptyBorder(4,4,4,4));
addLabelAndField("Module ID", 5, 0);
addLabelAndField("Module Name", 15, 1);
addLabelAndField("Start Datum", 10, 2);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 3;
gbc.gridwidth = 2;
JPanel p = new JPanel();
ui.add(p, gbc);
p.add(new JButton("Hinzufuegen"));
p.add(new JButton("Entfernen"));
p.add(new JButton("Alle Ausgeben"));
}
private void addLabelAndField(String labelText, int fieldWidth, int row) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5,5,5,5);
gbc.gridy = row;
gbc.anchor = GridBagConstraints.EAST;
ui.add(new JLabel(labelText), gbc);
gbc.gridx = 1;
gbc.anchor = GridBagConstraints.WEST;
ui.add(new JTextField(fieldWidth), gbc);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = () -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
GUILayout o = new GUILayout();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}
推荐阅读
- android - 如何在 Kotlin 的 Fragment 中使用 Android AlarmManager?
- python - Django 如何记录客户端 IP 地址?
- ruby-on-rails - Rails Fog 基于远程链接创建文件
- apache-nifi - NIFI || 仅为 True 布尔表达式发送邮件
- frama-c - 如何在 ACSL 中编写“是 2 的幂”谓词?
- scala - Neo4j社区版安装问题HostnamePortTest失败
- filenames - 文件名的 Base64 编码字符串
- terraform - 在 Terraform 0.12 中创建地图时保留列表顺序?
- git - git-lfs 是否从 git 历史记录中删除文件?
- node.js - 如何为 SQL Server/Sequelize/NodeJS 中的多列关联生成单个 bcrypt 哈希?