我想让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。我在打电话,所以我现在不能给你看代码。我希望我帮到你了。