О java GUI и понятном JFrame для показа нового контента? - PullRequest
4 голосов
/ 06 января 2012

Я изучаю Java и GUI. У меня есть несколько вопросов, и первый, если есть какое-либо существенное различие между созданием подкласса JFrame и экземпляра JFrame. Похоже, что подкласс является более мощным? Мне также интересно, нужно ли использовать этот код при создании графического интерфейса:

Container contentPane = getContentPane();
contentPane.setLayot(new Flowlayout());

Я добавляю свой класс GUI, пока что это простой тест, к задаче, которую я должен выполнить. Когда пользователь ввел какой-то текст в текстовое поле и нажмите кнопку, чтобы перейти к следующему шагу, как мне это сделать? сделать, чтобы очистить фрейм и показать новый контент, или есть специальный способ сделать это на Java? Я думаю, что должно быть лучше использовать одно и то же окно вместо создания нового !? Идентификатор помощи уточняется! Спасибо

    // Gui class

    import java.awt.FlowLayout; // layout
    import java.awt.event.ActionListener; // listener
    import java.awt.event.ActionEvent; // event

    import javax.swing.JFrame; // windows properties
    import javax.swing.JLabel; // row of text
    import javax.swing.JTextField; // enter text
    import javax.swing.JOptionPane; // pop up dialog
    import javax.swing.JButton; // buttons

    // import.javax.swing.*;

    public class Gui extends JFrame {

    private JLabel text1;
    private JTextField textInput1;
    private JTextField textInput2;
    private JButton nextButton;

    // constructor creates the window and it's components
    public Gui() {
        super("Bank"); // title
        setLayout(new FlowLayout()); // set default layout

        text1 = new JLabel("New customer");
        add(text1);

        textInput1 = new JTextField(10);
        add(textInput1);

        nextButton = new JButton("Continue");
        add(nextButton);

        // create object to handle the components (action listener object)
        frameHandler handler = new frameHandler();
        textInput1.addActionListener(handler);
        nextButton.addActionListener(handler);
    }

    // handle the events (class inside another class inherits contents from class outside)
    private class frameHandler implements ActionListener {

        public void actionPerformed(ActionEvent event){

            String input1 = "";

            // check if someone hits enter at first textfield
            if(event.getSource() == textInput1){
                input1 = String.format(event.getActionCommand());
                JOptionPane.showMessageDialog(null, input1);
            }

            else if(event.getSource() == nextButton){
                // ??
            }
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 06 января 2012

Этот небольшой код может помочь вам объяснить вещи:

import java.awt.event.*;
import javax.swing.*;

public class FrameDisplayTest implements ActionListener
{
    /*
     * Creating an object of JFrame instead of extending it 
     * has no side effects.
     */
    private JFrame frame;
    private JPanel panel, panel1;
    private JTextField tfield;
    private JButton nextButton, backButton;

    public FrameDisplayTest()
    {
        frame = new JFrame("Frame Display Test");
        // If you running your program from cmd, this line lets it comes
        // out of cmd when you click the top-right  RED Button.
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel();
        panel1 = new JPanel();

        tfield = new JTextField(10);

        nextButton = new JButton("NEXT");
        backButton = new JButton("BACK");
        nextButton.addActionListener(this);
        backButton.addActionListener(this);

        panel.add(tfield);
        panel.add(nextButton);
        panel1.add(backButton);

        frame.setContentPane(panel);
        frame.setSize(220, 220);
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent ae)
    {
        JButton button = (JButton) ae.getSource();
        if (tfield.getText().length() > 0)
        {
            if (button == nextButton)
            {   
                /*
                 * this will remove the first panel 
                 * and add the new panel to the frame.
                 */
                frame.remove(panel);
                frame.setContentPane(panel1);
            }
            else if (button  == backButton)
            {
                frame.remove(panel1);
                frame.setContentPane(panel);
            }
            frame.validate();
            frame.repaint(); // prefer to write this always.
        }
    }   

    public static void main(String[] args)
    {   
        /*
         * This is the most important part ofyour GUI app, never forget 
         * to schedule a job for your event dispatcher thread : 
         * by calling the function, method or constructor, responsible
         * for creating and displaying your GUI.
         */
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new FrameDisplayTest();
            }
        });
    }
}
4 голосов
/ 06 января 2012

если вы хотите переключить (добавить, а затем удалить) JComponents, тогда вам нужно

1) добавить / удалить JComponents и затем вызвать

revalidate();
repaint()// sometimes required

2) лучшим и простым выбором были бы приборы CardLayout

2 голосов
/ 06 января 2012

Если вам необходимо создать мастер, панель с кнопками «Далее» и «Предыдущая», а также при нажатии кнопки «Следующая / Предыдущая», на которой отображается какой-либо компонент. Вы можете попробовать использовать CardLayout.

CardLayout управляет двумя или более компонентами (обычно экземплярами JPanel), которые совместно используют одно и то же пространство отображения. CardLayout позволяет пользователю выбирать между компонентами.

Как использовать CardLayout

0 голосов
/ 14 июля 2015

Если ваш класс расширяет JFrame, вы можете сделать:

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