Java 隐藏Jpanel后如何更新Jframe

Java 隐藏Jpanel后如何更新Jframe,java,swing,panel,Java,Swing,Panel,我想在单击按钮时隐藏选定的面板。我有大部分的工作,但当面板是假的不更新 这是我尝试过的事情之一: compsToExperiment.setVisible(mapVis); updateUI(); private void updateUI() { SwingUtilities.updateComponentTreeUI(this); } 这条路对吗? 还有其他方法吗?updateComponentTreeUI不强制重新绘制。必须使用重新绘制方法 其中frame是面

我想在单击按钮时隐藏选定的面板。我有大部分的工作,但当面板是假的不更新

这是我尝试过的事情之一:

compsToExperiment.setVisible(mapVis);
updateUI();


private void updateUI() {
        SwingUtilities.updateComponentTreeUI(this);
    }
这条路对吗? 还有其他方法吗?

updateComponentTreeUI不强制重新绘制。必须使用重新绘制方法


其中frame是面板所在的顶部窗口。

您可以执行JFrame.invalidate刷新。请查看链接以了解更多详细信息。对不同问题的类似要求

除了调用setVisiblefalse之外,您不必做任何花哨的事情;在所说的JPanel上。以下示例证明了这一点:

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

public class InvisiblePanel
{
    private JPanel centerPanel;
    private JPanel footerPanel;

    private JTextField addField;
    private JTextField nameField;
    private JTextField occField;
    private JTextField phoneField;
    private JLabel nameLabel;
    private JLabel addLabel;
    private JLabel occLabel;
    private JLabel phoneLabel;

    private JPanel contentPane;
    private JButton hideButton;

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

        contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setBackground(Color.RED.darker().darker());
        contentPane.setLayout(new BorderLayout(5, 5));

        nameLabel = new JLabel("Guarantee Name : ");
        nameField = new JTextField();   
        addLabel = new JLabel("Address : ");
        addField = new JTextField();        
        occLabel = new JLabel("Occupation : ");
        occField = new JTextField();
        phoneLabel = new JLabel("Phone : ");
        phoneField = new JTextField();
        centerPanel = new JPanel();
        hideButton = new JButton("Hide");
        hideButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (centerPanel.isShowing())
                    centerPanel.setVisible(false);
                else
                    centerPanel.setVisible(true);
            }
        });

        centerPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.WHITE);
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        centerPanel.add(nameLabel);
        centerPanel.add(nameField);
        centerPanel.add(addLabel);
        centerPanel.add(addField);
        centerPanel.add(occLabel);
        centerPanel.add(occField);
        centerPanel.add(phoneLabel);
        centerPanel.add(phoneField);

        footerPanel = new JPanel();
        footerPanel.add(hideButton);

        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(footerPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    } 

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

我的Jframe是静态的,这是一个问题吗?我已经尝试了您建议的方法,但仍然没有刷新组件。我有疑问:要么setVisible本身触发重新绘制,不需要复制,要么需要重新布局,那么重新绘制是不够的。最有可能的是,updateComponentTree在OPs上下文中没有涉及更多细节,这只是我的一个假设:-@JamesHunter您能提供更多涉及的代码吗?CompstoExperience到底是什么?它的父项是什么?可能是错误的:通常,应用程序代码中不需要updateUI或updateComponentTreeUI。唯一的例外是切换LAF。为了帮助我们,我们需要更多的上下文,最好是一个SSCCE。这些新的代码片段远远不是一个SSCCE。。。它们甚至不包含更改可见性的零件。SSCCE。。。SSCCE。。。SSCCE。。。必修的。没有SSCCE,没有帮助-当然是你的决定。你继续发布不相关的代码。发布一个完整的运行示例,说明它是如何工作的。@James Hunter这里的所有内容,包括答案都是黑暗中的快照,发布一个,+1可以更好地使用JToggleButton,或者使用三元运算符
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class InvisiblePanel
{
    private JPanel centerPanel;
    private JPanel footerPanel;

    private JTextField addField;
    private JTextField nameField;
    private JTextField occField;
    private JTextField phoneField;
    private JLabel nameLabel;
    private JLabel addLabel;
    private JLabel occLabel;
    private JLabel phoneLabel;

    private JPanel contentPane;
    private JButton hideButton;

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

        contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setBackground(Color.RED.darker().darker());
        contentPane.setLayout(new BorderLayout(5, 5));

        nameLabel = new JLabel("Guarantee Name : ");
        nameField = new JTextField();   
        addLabel = new JLabel("Address : ");
        addField = new JTextField();        
        occLabel = new JLabel("Occupation : ");
        occField = new JTextField();
        phoneLabel = new JLabel("Phone : ");
        phoneField = new JTextField();
        centerPanel = new JPanel();
        hideButton = new JButton("Hide");
        hideButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (centerPanel.isShowing())
                    centerPanel.setVisible(false);
                else
                    centerPanel.setVisible(true);
            }
        });

        centerPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.WHITE);
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        centerPanel.add(nameLabel);
        centerPanel.add(nameField);
        centerPanel.add(addLabel);
        centerPanel.add(addField);
        centerPanel.add(occLabel);
        centerPanel.add(occField);
        centerPanel.add(phoneLabel);
        centerPanel.add(phoneField);

        footerPanel = new JPanel();
        footerPanel.add(hideButton);

        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(footerPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    } 

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