setVisible()对cardPanel不起作用



我想让cardPanel不可见,直到一个不在cardPanel上的操作完成。例如,当您选择该窗口上的某个Jradiobutton时,将打开一个窗口。我想用setVisible(boolean)来做这个。然而,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();
    }
}

你的类不需要扩展JFrame,你已经在类中创建了JFrame,如果你想在卡片间移动,那么像下面这样改变ActionListener

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

您将您的cardPanel设置为setVisible(false)不可见,但您从未将其设置为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,只需在创建之前将其设置为不可见即可。然后,将其设置为在侦听器中可见。

我希望它有帮助:)

在ActionListener中初始化它,而不是在构造函数中。你还必须在后面加上setVisible(true)。我认为你可以创建CardPannel类它扩展了JPannel。那样做更有意义。在cardpanel构造函数中添加JLabels,而不是在MainFrame构造函数中添加JLabels。我在打电话,所以我现在不能给你看代码。我希望我帮到你了。

相关内容

  • 没有找到相关文章