2016-08-16 54 views
0

我想使它成为cardPanels不可见,直到cardPanel上没有的动作完成。例如,当您在该窗口上选择某个Jradiobutton时,会打开一个窗口。我想使用setVisible(boolean)来做到这一点。但是,setVisible由于某种原因不起作用。有什么我失踪?cardPanel的setVisible()不起作用

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Component; 
import java.awt.Container; 
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.JRadioButton; 

public class MainFrame extends JFrame { 

    private JFrame frame = new JFrame("Swing Refresh Bug?"); 
    private Container contentPane = frame.getContentPane(); 
    private JPanel cardPanel = new JPanel(); 
    private CardLayout cardLayout = new CardLayout(); 
    private Component currentComponent; 
    private JButton next; 

    MainFrame() { 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // properties of the cardPanel 
     cardPanel.setLayout(cardLayout); 
     cardPanel.add(new JLabel("One"), "One"); 
     cardPanel.add(new JLabel("Two"), "Two"); 
     cardPanel.add(new JLabel("Three"), "Three"); 
     cardPanel.setVisible(false); 

     // Create a radio button 
     JRadioButton addNext = new JRadioButton("Add next"); 

     // Add the radio buttons listener 
     addNext.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       cardLayout.show(cardPanel, "One"); 
      } 
     }); 

     // Set the layout of the content pane. 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(cardPanel, BorderLayout.CENTER); 
     contentPane.add(addNext, BorderLayout.SOUTH); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public MainFrame(String title) { 

     MainFrame mf = new MainFrame(); 
    } 

} 
+3

*“调用setVisible不工作” * - 您永远不会调用'cardPanel.setVisible(...)'你贴的代码......当我实现工作正常,我那。请更新您的示例,包括'setVisible'问题。但是,如果这实际上是产生你所描述问题的代码,我真的不明白实际问题是什么......顺便说一下,你的类不需要扩展'JFrame',所以删除它并更改类名称,因为它有点误导你,因为你在代码中使用了一个单独的'JFrame'实例。 –

+0

好的。你在哪里实施它。哪条线。它不适合我。我摘下了延长线。 –

+0

那么,假设我正确地理解了这个问题,它对我来说“起作用”。我了解它,因为只要单选按钮未被按下,您希望卡面板不可见。所以,如果这是正确的,我把'cardPanel.setVisible(false);'放在'cardLayout.show(cardPanel,“One”);'之前'并且在'cardPanel.setVisible(true) –

回答

0

在ActionListener中不在构造函数中初始化它。之后你还必须说setVisible(true)。我认为你可以制作扩展JPannel的CardPannel类。这样做有更多的意义。而不是在MainFrame构造函数中添加JLabels,请在CardPannel构造函数中执行。我正在使用手机,因此我现在无法向您显示代码。我希望我能帮上忙。

0

您的类不需要延伸的JFrame,你已经在类创建的JFrame,如果要移动翻过卡,然后更改的ActionListener如下

addNext.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      cardLayout.next(cardPanel); 
      } 
     }); 
0

您可以通过setVisible(false)但你设置为不可见的CardPanel都从未将它设置为true,因此您的cardPanel(包含您的cardLayout)从不显示!

如果您希望在按下单选按钮时显示cardLayout,则只需在侦听器中添加setVisible(true)即可​​。

您也可以使用JRadioButton的isSelected()方法来检查它是否被点击。例如:

addNext.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if(addNext.isSelected()){ 
       cardPanel.setVisible(true);     
       cardLayout.show(cardPanel, "One"); 
      } 
      else{ 
       cardPanel.setVisible(false); 
       //or : cardLayout.show(cardPanel, "Two"); 
      } 
     } 
    }); 

如果您希望以这种方式打开JFrame,只需先创建它,然后将其设置为不可见。然后,您将其设置为在侦听器中可见。

我希望它帮助:)