2012-11-14 50 views
-1

我想隐藏选定的面板,当点击一个按钮时。我有大部分的工作,但当面板是假的不更新。如何隐藏Jpanel后更新Jframe

这我已经试过的事情之一:

compsToExperiment.setVisible(mapVis); 
updateUI(); 


private void updateUI() { 
     SwingUtilities.updateComponentTreeUI(this); 
    } 

这是在正确的轨道上? 还有其他的方法吗?

+2

可能是错误的轨道:通常,应用程序代码中都不需要updateUI和updateComponentTreeUI。一个例外是切换LAF。为了帮助,我们需要更多的上下文,最好的SSCCE – kleopatra

+1

这些新的片段远不是SSCCE ......他们甚至不包含改变可视性的部分。 – kleopatra

+1

SSCCE ... SSCCE ... SSCCE ...必需。没有SSCCE,当然没有帮助 - 你的决定。 – kleopatra

回答

2

updateComponentTreeUI()不强制重绘。您必须使用repaint方法。

compsToExperiment.setVisible(mapVis); 
frame.repaint(); 

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

+0

我的JFrame是静态的,这是一个问题?我已经试过你有什么建议仍然没有不刷新组件。 – Moe

+0

有我的疑惑:要么setVisible本身触发重绘(无需重复)或需要重新布局,然后重新绘制是不够的。最有可能的是,updateComponentTree没有涉及OPs上下文(没有进一步的细节,这只是我的一个假设:-) – kleopatra

+0

@JamesHunter你能提供更多的代码吗? compsToExperiment究竟是什么,它的父类是什么? –

2

你不需要做点什么花哨的事情,除此之外在JPanel上打电话setVisible(false);。以下示例证明:

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(); 
      } 
     }); 
    } 
} 
+0

+1可能比JToggleButton更好,或者使用三元运算符 – mKorbel