Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改按钮事件Java上的帧_Java - Fatal编程技术网

如何更改按钮事件Java上的帧

如何更改按钮事件Java上的帧,java,Java,我正在做一个简单的项目。它有这样的登录窗口 当用户单击“登录”按钮时,它应该“重新绘制”窗口(看起来应该发生在同一个窗口中),然后窗口看起来是这样的。 问题是-我不能“重新绘制”窗口-我唯一能做的事-它创建了一个新的框架,所以实际上总共有2个框架。 如何在同一帧中制作整个画面 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing

我正在做一个简单的项目。它有这样的登录窗口

当用户单击“登录”按钮时,它应该“重新绘制”窗口(看起来应该发生在同一个窗口中),然后窗口看起来是这样的。

问题是-我不能“重新绘制”窗口-我唯一能做的事-它创建了一个新的框架,所以实际上总共有2个框架。 如何在同一帧中制作整个画面

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;

public class Client
{
    private JFrame frame;
    private JTextArea allMessagesArea;
    private JTextArea inputArea;
    private JButton buttonSend;
    private JButton buttonExit;
    private String login;

    public  void addComponentsToPane(Container pane)
    {
        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10,10,10,10);
        c.fill = GridBagConstraints.HORIZONTAL;

        allMessagesArea = new JTextArea(25,50);
        c.weighty = 0.6;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=2;
        pane.add(allMessagesArea, c);


        inputArea = new JTextArea(12,50);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridwidth=2;
        c.weighty =0.3;
        c.gridx =0;
        c.gridy =1;
        pane.add(inputArea, c);

        buttonSend = new JButton("Send");
        c.weightx=0.5;
        c.weighty = 0.1;
        c.fill =  GridBagConstraints.HORIZONTAL;
        c.gridx =0;
        c.gridy=2;
        c.gridwidth =1;
        pane.add(buttonSend, c);


        buttonExit = new JButton("Exit");
        c.weightx =0.5;
        c.weighty = 0.1;
        c.fill =  GridBagConstraints.HORIZONTAL;
        c.gridx =1;
        c.gridy=2;
        c.gridwidth =1;
        pane.add(buttonExit, c);
    }


    public Client()
    {
        frame = new JFrame("Simple Client");

        frame.setSize(400,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        welcomePage();



        frame.setVisible(true);

    }

    public void welcomePage()
    {
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Your login:");
        panel.add(label);

        JTextField textField = new JTextField(15);
        panel.add(textField);

        JButton loginButton = new JButton("log in");
        panel.add(loginButton);

        JButton exitButton = new JButton("exit");
        panel.add(exitButton);
        frame.add(panel, BorderLayout.CENTER);

        loginButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                if(textField.getText().isEmpty())
                    JOptionPane.showMessageDialog(frame.getContentPane(), "Please enter your login");
                else
                {
                    login = textField.getText();
                    System.out.println(login);
                    frame = null;
                    frame = new JFrame("Simple Client");
                    frame.setSize(400,500);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    addComponentsToPane(frame.getContentPane());
                    frame.pack();
                    frame.setVisible(true);

                }
            }
        });

        exitButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

    }

    public static void main(String[] args)
    {

        Client frame = new Client();
    }
}
解决方案之一 可以创建两个面板(每个视图一个)并向其中添加所需的组件。首先,将第一个面板添加到
框架
(使用
frame.add(panel1)
)。如果要在同一窗口中显示第二个面板,可以删除第一个面板(使用
frame.remove(panel1)
),然后添加第二个面板(使用
frame.add(panel2)
)。最后,您必须调用
frame.pack()

这是您使用上述解决方案的代码:

public class Client
{
    private JFrame frame;
    private JTextArea allMessagesArea;
    private JTextArea inputArea;
    private JButton buttonSend;
    private JButton buttonExit;
    private String login;

    public  void addComponentsToPanel2()
    {               
        panel2.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10,10,10,10);
        c.fill = GridBagConstraints.HORIZONTAL;

        allMessagesArea = new JTextArea(25,50);
        c.weighty = 0.6;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=2;
        panel2.add(allMessagesArea, c);


        inputArea = new JTextArea(12,50);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridwidth=2;
        c.weighty =0.3;
        c.gridx =0;
        c.gridy =1;
        panel2.add(inputArea, c);

        buttonSend = new JButton("Send");
        c.weightx=0.5;
        c.weighty = 0.1;
        c.fill =  GridBagConstraints.HORIZONTAL;
        c.gridx =0;
        c.gridy=2;
        c.gridwidth =1;
        panel2.add(buttonSend, c);


        buttonExit = new JButton("Exit");
        c.weightx =0.5;
        c.weighty = 0.1;
        c.fill =  GridBagConstraints.HORIZONTAL;
        c.gridx =1;
        c.gridy=2;
        c.gridwidth =1;
        panel2.add(buttonExit, c);   
    }


    public Client()
    {
        frame = new JFrame("Simple Client");

        frame.setSize(400,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        welcomePage();

        frame.setVisible(true);
    }

    public void welcomePage()
    {
        panel1 = new JPanel();
        JLabel label = new JLabel("Your login:");
        panel1.add(label);

        JTextField textField = new JTextField(15);
        panel1.add(textField);

        JButton loginButton = new JButton("log in");
        panel1.add(loginButton);

        JButton exitButton = new JButton("exit");
        panel1.add(exitButton);
        frame.add(panel1, BorderLayout.CENTER);

        loginButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                if(textField.getText().isEmpty())
                    JOptionPane.showMessageDialog(frame.getContentPane(), "Please enter your login");
                else
                {
                    login = textField.getText();
                    System.out.println(login);

                    panel2 = new JPanel();
                    addComponentsToPanel2();
                    frame.remove(panel1);
                    frame.add(panel2);
                    //frame.repaint();
                    frame.pack();
                }
            }
        });

        exitButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

    }

    public static void main(String[] args)
    {

        Client frame = new Client();
    }

    private JPanel panel1;
    private JPanel panel2;
}

此布局允许开发人员在面板之间切换。它通过创建一个“甲板”面板来工作,该面板将包含所有可能显示的面板:

CardLayout layout = new CardLayout();
JPanel deck = new JPanel();
deck.setLayout(layout);

JPanel firstCard = new JPanel();
JPanel secondCard = new JPanel();
deck.add(firstCard, "first");
deck.add(secondCard, "second");
public void actionPerformed(ActionEvent e) {
    layout.show(deck, "second");
}
单击按钮时,该按钮的
ActionListener
应调用
CardLayout
上的
show(Container,String)
next(Container)
previous(Container)
,以切换显示的面板:

CardLayout layout = new CardLayout();
JPanel deck = new JPanel();
deck.setLayout(layout);

JPanel firstCard = new JPanel();
JPanel secondCard = new JPanel();
deck.add(firstCard, "first");
deck.add(secondCard, "second");
public void actionPerformed(ActionEvent e) {
    layout.show(deck, "second");
}

给你的一些想法:1)你可以在一个框架内登录和信息面板。看一看。或者更好的方法是,在./hereaboutmulti-layeredjframe/JPanel上搜索一下,看看其他人是如何做到这一点的。因此,这将基本上在一个Jframe中获得所有面板。2) 有了这一点,剩下的唯一要做的就是对要显示的Jpanel或在另一个Jpanel之上进行一些操作。我认为这应该足以让你继续下去。或者,你可以把你的JFrame分成两部分:顶部和底部,顶部显示登录名,底部显示信息。这取决于应用程序的流程。也许你也可以读一下。谢谢你,比尔。第一种方法更“优雅”。我将尝试使用它,而不是删除当前显示的面板以显示另一个面板,只需使用
CardLayout