jframe中的多个jpanel

时间:2013-09-12 23:58:45

标签: java swing jframe jpanel windowbuilder

我目前正在尝试使用具有多个jpanel的jframe创建一个小应用程序。我有几个问题。

  1. 必须有一种更简洁的方法来制作一个具有16个不同面板的应用程序,而不是将它们全部放在一个类中。还有什么其他选择。

  2. 目前我只有3个面板。我还没有进一步,因为有两个小组没有反映我的变化。它们是我使用的两个面板

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

3 个答案:

答案 0 :(得分:4)

您的错误是使用null布局,revalidateinvalidatevalidate将不再具有任何重要意义,因为它们与支持布局管理API有关

因为您已经删除了布局管理器,所以面板不再有任何东西可以告诉它们应该出现的大小或位置,这意味着当您添加新组件时,它的大小为0x0,位置为0x0 < / p>

使用示例更新

您应该利用布局管理器API的原因有很多,包括自动处理字体在不同系统上呈现方式之间的差异,动态和可调整大小的布局,屏幕分辨率和DPI的差异等等。

它还鼓励您将您的UI分离到责任区域,而不是尝试将整个UI代码转储到一个类中(是的,我已经看到这样做了,是的,我花了我职业生涯的大部分时间来清理做完这个的人......)

enter image description here enter image description here enter image description here

此示例使用CardLayoutGridBagLayout,但您应该花时间使用some of the others avaiable in the default JDK

成为farmiluar
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"));
        }           
    }
}

答案 1 :(得分:1)

  

必须有一种更简洁的方法来制作一个具有16个不同面板的应用程序,而不是将它们全部放在一个类中。还有什么其他选择。

您可以根据需要自由创建和使用多个类。因此,如果JPanel拥有一个复杂的GUI,您可能希望在其他地方重复使用,或者具有自己特定且独立的功能,那么无论如何都要将代码放在自己的类中。

  

目前我只有3个面板。我没有进一步,因为其中2个面板没有反映我的变化。它们是我使用的两个面板

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

闻起来像是在试图重新发明CardLayout。为什么在你可以使用它时重新发明它?

是的,MadProgrammer所说的关于null布局的一切都是真的。你应该避免使用它。

答案 2 :(得分:0)

哦,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);
            }
        });
    }

}

Tabbed Pane Demo

关于在一个班级中有16个小组的另一个问题:

  1. 您可以在面板中设置面板来整理内容。
  2. 您可以将JPanel子类化,并将子类放在它们自己的.java文件中。
  3. 如果我可以提供进一步帮助,您可以给我发电子邮件。 kaydell@yahoo.com(我喜欢帮助人们编程,我也从中学习。)