如何隐藏当前的 JPanel 并在 Java 中显示一个带有按钮的新 JPanel?

How do I hide the current JPanel and show a new one with a button in Java?(如何隐藏当前的 JPanel 并在 Java 中显示一个带有按钮的新 JPanel?)

本文介绍了如何隐藏当前的 JPanel 并在 Java 中显示一个带有按钮的新 JPanel?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不幸的是,我不得不在这个程序中使用多个窗口,而且我认为 CardLayout 不会起作用,因为我不能在不同布局之间设置任何不变的按钮.所以我试图编写一个按钮来隐藏当前的 JPanel (thePanel) 并显示一个新的 (thePlacebo).

I unfortunately have to use multiple windows in this program and I don't think CardLayout is going to work because I can't have any buttons constant between the different layouts. So I'm trying to code a button to hide the present JPanel (thePanel) and show a new one (thePlacebo).

我正在尝试像这样将面板隐藏在 ActionListener 中:

I'm trying to hide thePanel in an ActionListener like this:

frame.getContentPane().remove(thePanel);

我认为这会起作用,但它只是在我按下按钮时冻结了我的程序.

I thought this would work, but it just freezes my program as soon as I hit the button.

这里有一段上下文代码:

Here's a chunk of the code for context:

public class Reflexology1 extends JFrame{
JButton button1, button2;
JButton movingButton;
JTextArea textArea1;
int buttonAClicked, buttonDClicked;
private long _openTime = 0;
private long _closeTime = 0;
JPanel thePanel = new JPanel();
JPanel thePlacebo = new JPanel();
final JFrame frame = new JFrame("Reflexology");

public static void main(String[] args){
    new Reflexology1();
}

public Reflexology1(){


    frame.setSize(600, 475);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Reflexology 1.0");
    frame.setResizable(false);


    button1 = new JButton("Accept");
    button2 = new JButton("Decline");
    movingButton = new JButton("Click Me");

    ListenForAcceptButton lForAButton = new ListenForAcceptButton();
    ListenForDeclineButton lForDButton = new ListenForDeclineButton();
    button1.addActionListener(lForAButton);
    button2.addActionListener(lForDButton);
    //movingButton.addActionListener(lForMButton);

    JTextArea textArea1 = new JTextArea(24, 50);

    textArea1.setText("Tracking Events
");
    textArea1.setLineWrap(true);
    textArea1.setWrapStyleWord(true);
    textArea1.setSize(15, 50);

    FileReader reader = null;
    try {
        reader = new FileReader("EULA.txt");
        textArea1.read(reader, "EULA.txt");
    } catch (IOException exception) {
        System.err.println("Problem loading file");
        exception.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException exception) {
                System.err.println("Error closing reader");
                exception.printStackTrace();
            }
        }
    }

    JScrollPane scrollBar1 = new JScrollPane(textArea1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    AdjustmentListener listener = new MyAdjustmentListener();

    thePanel.add(scrollBar1);
    thePanel.add(button1);
    thePanel.add(button2);
    thePlacebo.add(movingButton);

    frame.add(thePanel);

    ListenForWindow lForWindow = new ListenForWindow();
    frame.addWindowListener(lForWindow);
    frame.setVisible(true);

}
// Implement listeners

private class ListenForAcceptButton implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == button1){
            Calendar ClCDateTime = Calendar.getInstance();
            System.out.println(ClCDateTime.getTimeInMillis() - _openTime);
            _closeTime = ClCDateTime.getTimeInMillis() - _openTime;
            frame.getContentPane().remove(thePanel);
        }
    }
}

有人知道我做错了什么吗?

Does anybody know what I might be doing wrong?

推荐答案

从容器中移除组件后,它进入 invalidate 状态.要将其恢复到 valid 状态,您必须对其进行 revalidaterepaint.在您的情况下,您是直接从 JFrame 添加/删除组件,因此根据 Java 版本,您可以这样做:

After removing components from a container, it goes into the invalidate state. To bring it back to the valid state you have to revalidate and repaint that. In your case you are directly adding/removing components from JFrame so depending on the Java version you can do this :

frame.revalidate(); // For Java 1.7 or above
frame.getContentPane().validate(); // For Java 1.6 or below
frame.repaint();

这是一个可以帮助您的工作示例:

Here is one working example for your help :

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

public class Assignment
{
    private JFrame frame;
    private JPanel firstPanel;
    private JPanel secondPanel;

    private JButton forwardButton;
    private JButton backButton;

    private void displayGUI()
    {
        frame = new JFrame("Assignment");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        firstPanel = new JPanel();
        firstPanel.setOpaque(true);
        firstPanel.setBackground(Color.BLUE);

        secondPanel = new JPanel();
        secondPanel.setOpaque(true);
        secondPanel.setBackground(Color.RED);

        forwardButton = new JButton("Forward");
        forwardButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                frame.remove(firstPanel);
                frame.add(secondPanel);
                frame.revalidate(); // For Java 1.7 or above.
                // frame.getContentPane().validate(); // For Java 1.6 or below.
                frame.repaint();
            }
        });

        backButton = new JButton("Back");
        backButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                frame.remove(secondPanel);
                frame.add(firstPanel);
                frame.revalidate(); // For Java 1.7 or above.
                // frame.getContentPane().validate(); // For Java 1.6 or below.
                frame.repaint();
            }
        });

        firstPanel.add(forwardButton);
        secondPanel.add(backButton);

        frame.add(firstPanel);
        frame.setSize(300, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Assignment().displayGUI();
            }
        });
    }
}

这篇关于如何隐藏当前的 JPanel 并在 Java 中显示一个带有按钮的新 JPanel?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何隐藏当前的 JPanel 并在 Java 中显示一个带有按钮的新 JPanel?

基础教程推荐