Java структура JFrame GUI - PullRequest
       38

Java структура JFrame GUI

1 голос
/ 18 июня 2020

Я учусь компьютерным наукам в первый год моего ученичества.

Вначале мы начали с процедурного Java программирования, теперь мы должны изучить объектно-ориентированное Java. Для начала мы должны запрограммировать GUI с некоторыми функциями и чем-то, чтобы сохранить некоторые строки, как в базе данных. Во всяком случае, я еще не там. Я все еще застрял в создании и структуре GUI. В нем есть все, что ему нужно, но структура, которую я пытаюсь получить, на самом деле не работает.

Итак, вот что я получил:

Test 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);

    }
}

Modul Gui. 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);
    }
}

Извините Может быть, проблема действительно проста, но, как я уже сказал, m довольно новичок в программировании: 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);
    }
}

И получается вот что: Output

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Ладно, попробую сделать это с помощью Диспетчера верстки ... Какой ты пользовался? Я бы попробовал с GroupLayout.

Ах, в этом и заключается общая ошибка. Немногие, если вообще есть, хорошие макеты создаются с использованием одиночного макета. Вместо этого мы обычно комбинируем их для создания необходимых GUI.

Возьмите этот макет, например:

enter image description here

Он использует GridBagLayout для «внешней» части, но затем помещает (JPanel с a) FlowLayout в последней строке этого GBL, чтобы удерживать кнопки.

enter image description here

Вот код, использованный для его объединения:

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);
    }
}
2 голосов
/ 18 июня 2020

В настоящий момент вы добавляете компоненты 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

Если вы хотите поиграйте с определенными макетами c, вы можете проверить Java уроки . Также дополнительную информацию о том, как использовать JPanel, можно найти в документации Java .

...