点击按钮时如何将Jpanel替换为jframe上的另一个jpanel
当按下框架左侧的JPanel中存在的相应按钮时,我想要替换框架中央的JPanel。 我正在使用cardlayout替换中心的面板。 这里是我用于更改按钮单击面板上的示例代码,但它不起作用。任何人都可以让我知道代码中的最新错误。点击按钮时如何将Jpanel替换为jframe上的另一个jpanel
库扩展的JFrame
Public Library(){
Container container = getContentPane();
container.setLayout(new BorderLayout());
setExtendedState(JFrame.MAXIMIZED_BOTH);
banner = new BannerPanel();
container.add(banner,BorderLayout.NORTH);
MenuButtons = new MenuButtonPanel();
container.add(MenuButtons,BorderLayout.WEST);
SelectedButtonPanel = new SelectedPanel(container);
setLocationRelativeTo(null);
setVisible(true);
init();
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
MenuButtonPanel扩展JPanel并有多个按钮它。内部类的它ButtonHandler器具HTE actionListner为按钮
//inner class
class ButtonEventHandler implements ActionListener {
public void actionPerformed(ActionEvent event){
SelectedPanel selectObj = new SelectedPanel();
if("about".equals(event.getActionCommand()))
{
selectObj.showReplacePanel("about");
}
else if("checkout".equals(event.getActionCommand()))
{
selectObj.showReplacePanel("checkout");
}
else if("search".equals(event.getActionCommand()))
{
selectObj.showReplacePanel("search");
}
的SelectedPanel应在帧的中央显示的替换的JPanel
public SelectedPanel() {}
public SelectedPanel(Container framePane)
{
addSelectedPanel(framePane);
}
public void addSelectedPanel(Container framePane)
{
cardPanel = new JPanel();
//set layout of panel
cardPanel.setLayout(new CardLayout());
cardPanel.setBorder(null);
cardPanel.setForeground(new Color(0, 0, 0));
//this.selObj = selObj;
aboutPanel = new About();
checkoutPanel = new Checkout();
searchPanel = new Search();
cardPanel.add(aboutPanel,ABOUTBUTTON);
cardPanel.add(checkoutPanel,CHECKOUTBUTTON);
cardPanel.add(searchPanel, SEARCHBUTTON);
framePane.add(cardPanel, BorderLayout.CENTER); }
的selectedPanel类也有方法showReplacePanel(),它是在buttonClick的actionPerformed中调用。
public void showReplacePanel(String selObj)
{
System.out.println("cardlayout entered");
CardLayout cl = (CardLayout)(cardPanel.getLayout());
System.out.println("cardlayout entered");
switch(selObj){
case "about":
cl.show(cardPanel,ABOUTBUTTON);
break;
case "search":
//this.repPanel = searchPanel;
cl.show(cardPanel,SEARCHBUTTON);
break;
case "checkout":
cl.show(cardPanel,CHECKOUTBUTTON);
//this.repPanel = checkoutPanel;
break;
我创建了一个例子给你,看看该actionPerformed(ActionEvent e)
方法
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PanelSwap extends JPanel implements ActionListener {
JPanel firstPanel = new JPanel();
JPanel secondPanel = new JPanel();
public PanelSwap() {
super(new BorderLayout());
firstPanel.setBackground(Color.RED);
secondPanel.setBackground(Color.YELLOW);
JButton swap1 = new JButton("SwapToYellow");
swap1.addActionListener(this);
JButton swap2 = new JButton("SwapToRed");
swap2.addActionListener(this);
firstPanel.add(swap1);
secondPanel.add(swap2);
add(firstPanel);
}
/** Listens to the buttons and perfomr the swap. */
public void actionPerformed(ActionEvent e) {
for (Component component : getComponents())
if (firstPanel == component) {
remove(firstPanel);
add(secondPanel);
} else {
remove(secondPanel);
add(firstPanel);
}
repaint();
revalidate();
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("PanelSwap");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
JComponent newContentPane = new PanelSwap();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
时,它现在可以工作尽管你提供的例子对于这个:-)来说是很好的+1,但是它不被认为是一个好习惯,当Swing已经有一个可以处理这种情况的Layout Manager时()/ repaint()'-1,另外,OP使用'CardLayout',它不是像'revalidate()/ repaint()'这样的调用的从属设备:-) –
谢谢为答复。但有8个按钮,每按一下按钮,我需要更换面板。我在网上看到的所有例子都是在2个面板之间切换的。所以我实现了cardlayout。我找出了我的代码的问题。我dint声明showReplacePanel()方法和cardPanel为静态。在将htem声明为静态之后,面板被替换。 – anu
你有没有动作监听器添加到些什么呢? – Cruncher
请提供一个简单,简短,可编辑和完整的示例,[SSCCE](http://sscce.org/),以获得更好的帮助。 :-)一个相关的[示例](http://stackoverflow.com/a/9349137/1057230),同时提供一些帮助:-) –
对于一个空间中的许多组件,使用['CardLayout']( http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html)在这[简短示例](http://stackoverflow.com/a/5786005/418556)中可见。 –