繁体   English   中英

Java结构JFrame图形界面

[英]Java structure JFrame GUI

在我学徒的第一年,我是一名计算机科学家。

一开始我们从程序Java编程开始,现在我们要学习面向object的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);
    }
}

抱歉,也许问题真的很简单,但就像我说的我对编程很陌生:DI 也用 setBounds 和 setLayout(null) 尝试过......好吧也没有真正起作用。

我想将我的代码结构如下:

LabelModulID
TextFeldModulID
LabelModulName
TextFeldModulName
LabelStartDatum
TextFeldStartDatum
ButtonHinzufuegen
ButtonEntfernen
ButtonAlleAusgeben

你们知道我该怎么做吗?

有人知道我如何使用对象或其他东西来存储一些模块(模块),比如在数据库中。 像 class 模块列表和模块。

提前谢谢各位!!

//编辑//

这就是我在你的帮助下得到的新代码。 看起来不太好,但第二次尝试也不错:

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。

以这种布局为例:

在此处输入图像描述

它使用GridBagLayout作为“外部”部分,然后在该 GBL 的最后一行放置一个( JPanel和一个) 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);
    }
}

目前,您正在将 GUI 组件直接添加到JFrame中。 相反,您需要一个JPanel来保存所有 GUI 组件,然后将该JPanel添加到您的JFrame

例如:

JPanel panel = new JPanel();
panel.add(button1);
panel.add(button2);
panel.add(label1);

add(panel); // Adds panel to the JFrame

如果您想尝试特定的布局,可以查看Java 教程 Java 文档中还有关于如何使用JPanel的更多信息。

暂无
暂无

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

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