Несколько jpanels в jframe

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

  1. Должен быть более чистый способ сделать приложение с 16 различными панелями, чем помещать все это в один класс. Какие еще есть варианты.

  2. Сейчас у меня только 3 панели. Я не пошел дальше, потому что 2 панели не отражают мои изменения. Это две панели, которые я вызываю с помощью

    removeAll();
    add();
    revalidate();
    repaint(); 

Что может привести к тому, что другие панели, которые я вызываю, будут пустыми?

Вот посмотрите, что у меня есть, любой совет будет замечательным. Спасибо

public class Jframetest extends JFrame {

    private JPanel Home;
    private JPanel masslog;
    private JPanel DEH;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Jframetest frame = new Jframetest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Jframetest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setBounds(100, 100, 618, 373);
        Home = new JPanel();
        masslog = new JPanel();
        DEH = new JPanel();

        Home.setBackground(new Color(255, 250, 250));
        Home.setBorder(new LineBorder(Color.DARK_GRAY, 1, true));
        DEH.setBackground(new Color(255, 250, 250));
        DEH.setBorder(new LineBorder(Color.DARK_GRAY, 1, true));
        masslog.setBackground(new Color(255, 250, 250));
        masslog.setBorder(new LineBorder(Color.DARK_GRAY, 1, true));
        setContentPane(Home);
        Home.setLayout(null);

        JButton dehbutton = new JButton("Sign in");
        dehbutton.setFont(new Font("Tahoma", Font.PLAIN, 14));
        dehbutton.setForeground(new Color(0, 0, 0));
        dehbutton.setBackground(UIManager.getColor("Menu.selectionBackground"));
        DEH.add(dehbutton);

        JButton btnNewButton = new JButton("Data Entry login");
        btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 14));
        btnNewButton.setForeground(new Color(0, 0, 0));
        btnNewButton.setBackground(UIManager.getColor("Menu.selectionBackground"));

        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Home.removeAll();
                Home.add(DEH);
                Home.revalidate();
                Home.repaint();

                // JOptionPane.showMessageDialog(null, "Username/Password incorrect");
            }
        });
        btnNewButton.setBounds(44, 214, 204, 61);
        Home.add(btnNewButton);

        final JButton button = new JButton("Manager and Associate login");
        button.setFont(new Font("Tahoma", Font.PLAIN, 14));
        button.setBackground(UIManager.getColor("EditorPane.selectionBackground"));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Home.removeAll();
                Home.add(masslog);
                Home.revalidate();
                Home.repaint();

            }
        });
        button.setBounds(340, 214, 204, 61);
        Home.add(button);

        JTextPane txtpnEmployeeLogin = new JTextPane();
        txtpnEmployeeLogin.setForeground(Color.DARK_GRAY);
        txtpnEmployeeLogin.setBackground(Color.WHITE);
        txtpnEmployeeLogin.setFont(new Font("Tahoma", Font.PLAIN, 34));
        txtpnEmployeeLogin.setText("Employee Login");
        txtpnEmployeeLogin.setBounds(181, 123, 260, 52);
        Home.add(txtpnEmployeeLogin);

        JLabel lblNewLabel = new JLabel("New label");
        lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Will and April\\Downloads\\your-logo-here.jpg"));
        lblNewLabel.setBounds(427, 11, 165, 67);
        Home.add(lblNewLabel);

    }

}

person Alex Miles    schedule 12.09.2013    source источник
comment
1-я ошибка заключается в использовании макета null, revalidate, invalidate и validate больше не будут иметь существенного значения, поскольку они связаны с поддержкой API управления макетом.   -  person MadProgrammer    schedule 13.09.2013


Ответы (3)


Ваша ошибка заключается в использовании макета null, revalidate, invalidate и validate больше не будут иметь существенного значения, поскольку они связаны с поддержкой API управления макетом.

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

Обновить с помощью примера

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

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

введите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображения

В этом примере используются CardLayout и GridBagLayout, но вы должны найти время, чтобы ознакомиться с некоторые другие доступны в JDK по умолчанию

import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class FrameTest extends JFrame {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameTest frame = new FrameTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public FrameTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final CardLayout layout = new CardLayout();
        setLayout(layout);
        LoginPane loginPane = new LoginPane();
        add(loginPane, "login");
        add(new NewLoginPane(), "newLogin");
        add(new ManagerLoginPane(), "managerLogin");

        loginPane.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String command = e.getActionCommand();
                System.out.println(command);
                if ("new".equals(command)) {
                    layout.show(getContentPane(), "newLogin");
                } else if ("manager".equals(command)) {
                    layout.show(getContentPane(), "managerLogin");
                }
            }
        });

        layout.show(getContentPane(), "layout");

        pack();
        setLocationRelativeTo(null);
    }

    public class LoginPane extends JPanel {

        private JTextField userName;
        private JButton newButton;
        private JButton managerButton;

        public LoginPane() {
            setBorder(new EmptyBorder(20, 20, 20, 20));
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.weightx = 1;
            gbc.insets = new Insets(10, 10, 10, 10);

            userName = new JTextField(10);
            userName.setFont(new Font("Tahoma", Font.PLAIN, 34));
            add(userName, gbc);

            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 1;
            gbc.weightx = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            newButton = new JButton("Sign in");
            newButton.setActionCommand("new");
            managerButton = new JButton("Manager and Associate login");
            managerButton.setActionCommand("manager");

            add(newButton, gbc);
            gbc.gridx++;
            add(managerButton, gbc);                
        }

        public void addActionListener(ActionListener listener) {
            newButton.addActionListener(listener);
            managerButton.addActionListener(listener);
        }

        public void remveActionListener(ActionListener listener) {
            newButton.removeActionListener(listener);
            managerButton.removeActionListener(listener);
        }

        public String getUserName() {               
            return userName.getText();                
        }            
    }

    public class NewLoginPane extends JPanel {
        public NewLoginPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("New Login"));
        }           
    }

    public class ManagerLoginPane extends JPanel {
        public ManagerLoginPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Welcome overlord"));
        }           
    }
}
person MadProgrammer    schedule 13.09.2013
comment
Спасибо за помощь, переключение раскладки решило проблему! Также благодарна за исчерпывающий ответ. (Дал бы +1, но нужно 15 повторений) - person Alex Miles; 13.09.2013
comment
Менеджеры макетов могут показаться запутанными, но они сэкономят вам много времени и работы в долгосрочной перспективе;) - person MadProgrammer; 13.09.2013

Должен быть более чистый способ сделать приложение с 16 различными панелями, чем помещать все это в один класс. Какие еще есть варианты.

Вы можете создавать и использовать столько классов, сколько необходимо. Поэтому, если JPanel содержит сложный фрагмент графического интерфейса, который вы можете повторно использовать в другом месте, или который имеет свою собственную специфическую и отдельную функциональность, во что бы то ни стало поместите код в свой собственный класс.

Сейчас у меня только 3 панели. Я не пошел дальше, потому что 2 панели не отражают мои изменения. Это две панели, которые я вызываю с помощью

removeAll();
add();
revalidate();
repaint(); 

Похоже, вы пытаетесь заново изобрести CardLayout. Зачем заново изобретать, если можно просто использовать?

И да, все, что MadProgrammer говорит о нулевом макете, верно. Вам следует избегать его использования.

person Hovercraft Full Of Eels    schedule 13.09.2013

О, CardLayout может работать на вас. Я думал об использовании JTabbedPane. Вот мои мысли в примере кода:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;


public class TabbedPaneDemo extends JFrame {

    public TabbedPaneDemo() {

        // set the layout of the frame to all the addition of all components
        setLayout(new FlowLayout());

        // create a tabbed pane
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setPreferredSize(new Dimension(500,500));
        add(tabbedPane);

        // create three panels to be added to this frame
        JPanel redPanel = new JPanel();
        JPanel greenPanel = new JPanel();
        JPanel bluePanel = new JPanel();

        // set the colors of the panels
        redPanel.setBackground(Color.RED);
        greenPanel.setBackground(Color.GREEN);
        bluePanel.setBackground(Color.BLUE);

        // set the preferred size of each panel
        redPanel.setPreferredSize(new Dimension(150,150));
        greenPanel.setPreferredSize(new Dimension(150,150));
        bluePanel.setPreferredSize(new Dimension(150,150));

        // add the panels to the tabbed pane
        tabbedPane.addTab("Red Panel", redPanel);
        tabbedPane.addTab("Green Panel", greenPanel);
        tabbedPane.addTab("Blue Panel", bluePanel);

        // finish initializing this window
        setSize(500,500); // size the window to fit its components (i.e. panels in this case)
        setLocationRelativeTo(null); // center this window
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // exit application when this window is closed
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TabbedPaneDemo().setVisible(true);
            }
        });
    }

}

Демонстрация панели с вкладками

И на ваш другой вопрос о наличии 16 панелей в одном классе:

  1. У вас могут быть панели внутри панели для организации вещей.
  2. Вы можете создать подкласс JPanel и поместить подклассы в свои собственные файлы .java.

Вы можете отправить мне электронное письмо, если я могу быть полезен. [email protected] (Мне нравится помогать людям в их программировании, и я тоже учусь на этом.)

person Kaydell    schedule 13.09.2013