Как создать несколько JPanel с вводом JTextField? - PullRequest
0 голосов
/ 27 мая 2020

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

Prototype GUI

Моя идея состоит в том, что когда пользователь нажимает AddMoreButton, он добавит одну панель JPanel, как P Panel, а затем пользователь могу написать словарь, чтобы отправить его в мою базу данных, можно ли создать что-то такое? Я попытался зациклить панель P, но она не изменилась, любая помощь будет оценена.

private JPanel SetUpCreate() {
        JPanel createPanel = new JPanel();
        nameListInput = new JTextField(INPUT_FIELD_WIDTH);
        termInput = new JTextField(INPUT_FIELD_WIDTH);
        defintionInput = new JTextField(INPUT_FIELD_WIDTH);
        p = new JPanel();
        doneCreate = new JButton("Done");
        doneCreate.addActionListener(new DoneCreateButtonAction());
        addMoreButton = new JButton("Add");
        addMoreButton.addActionListener(new AddMorePanelsListener());
        p.setBorder(new BevelBorder(BevelBorder.RAISED));
        p.add(termInput);
        p.add(defintionInput);
        JScrollPane pane = new JScrollPane(p);
        createPanel.add(nameListInput);
        createPanel.add(p);
        createPanel.add(pane);
        createPanel.add(doneCreate);
        return createPanel;

    }
    private class DoneCreateButtonAction implements ActionListener {
        public DoneCreateButtonAction() {
            super();
        }

        public void actionPerformed(ActionEvent e) {

            String namelist = nameListInput.getText();
            String termglosa = termInput.getText();
            String defintionglosa = defintionInput.getText();
            try {
                if (model.createWordList(namelist) && (model.createGlosa(termglosa, defintionglosa))) {

                    cl.show(cardPanel, "home");

                }
            } catch (IOException e1) {

                JOptionPane.showMessageDialog(frame, "skapelsen av listan fungerar ej.");

            }

        }

    }
private class AddMoreButtonAction implements ActionListener {
        public AddMoreButtonAction() {
            super();
        }

        public void actionPerformed(ActionEvent e) {



        }
    }


Ответы [ 2 ]

1 голос
/ 27 мая 2020

Из вашего вопроса я понял, что вы хотите добавлять новую панель каждый раз, когда пользователь нажимает кнопку Добавить , а добавляемая панель содержит поля для ввода слова и его определения.

Я вижу, что JScrollPane появляется в коде, который вы указали в своем вопросе. Думаю, это правильная реализация. В приведенном ниже коде каждый раз, когда пользователь нажимает кнопку Добавить , я создаю панель, содержащую поля для определения одного слова. Эта недавно созданная панель добавляется к существующей панели, которая использует GridLayout с одним столбцом. Следовательно, каждый раз, когда добавляется новая панель определения слова, она помещается непосредственно под последней добавленной панелью слов, и эта панель GridLayout помещается внутри JScrollPane. Следовательно, каждый раз, когда добавляется панель определения слова, высота панели GridLayout увеличивается, а JScrollPane корректируется соответствующим образом.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class MorPanel implements ActionListener, Runnable {
    private static final String  ADD = "Add";
    private JFrame  frame;
    private JPanel  vocabularyPanel;

    @Override
    public void run() {
        showGui();
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        String actionCommand = actionEvent.getActionCommand();
        switch (actionCommand) {
            case ADD:
                vocabularyPanel.add(createWordPanel());
                vocabularyPanel.revalidate();
                vocabularyPanel.repaint();
                break;
            default:
                JOptionPane.showMessageDialog(frame,
                                              actionCommand,
                                              "Unhandled",
                                              JOptionPane.ERROR_MESSAGE);
        }
    }

    public JButton createButton(String text) {
        JButton button = new JButton(text);
        button.addActionListener(this);
        return button;
    }

    public JPanel createButtonsPanel() {
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(createButton(ADD));
        return buttonsPanel;
    }

    private JScrollPane createMainPanel() {
        vocabularyPanel = new JPanel(new GridLayout(0, 1));
        vocabularyPanel.add(createWordPanel());
        JScrollPane scrollPane = new JScrollPane(vocabularyPanel);
        return scrollPane;
    }

    private JPanel createWordPanel() {
        JPanel wordPanel = new JPanel();
        JLabel wordLabel = new JLabel("Enter Term");
        JTextField wordTextField = new JTextField(10);
        JLabel definitionLabel = new JLabel("Enter Term Definition");
        JTextField definitionTextField = new JTextField(10);
        wordPanel.add(wordLabel);
        wordPanel.add(wordTextField);
        wordPanel.add(definitionLabel);
        wordPanel.add(definitionTextField);
        return wordPanel;
    }

    private void showGui() {
        frame = new JFrame("Vocabulary");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createMainPanel(), BorderLayout.CENTER);
        frame.add(createButtonsPanel(), BorderLayout.PAGE_END);
        frame.setSize(480, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new MorPanel());
    }
}
1 голос
/ 27 мая 2020

Поскольку ваш код не является минимальным воспроизводимым примером , я не могу предоставить дополнительную помощь, кроме этой:

Красная часть: ваш основной JPanel с BoxLayout Зеленая часть: другая JPanel с вашим JTextField в нем. Фиолетовая часть: JScrollPane Синие части: индивидуальные JPanels с двумя панелями в них, одна сверху для номера, одна снизу для JTextField s и значка, поэтому я бы сказал GridBagLayout или BoxLayout + FlowLayout Оранжевая часть: JPanel с GridBagLayout или FlowLayout

Каждый раз, когда вы нажимаете c на значок +, вы просто создаете новый экземпляр пользовательского синего JPanel и все.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...