2012-10-06 80 views
4
  • >我在包'abc'中定义了一个jframe。这个jframe也是一个主要类。
  • >相同的包'abc'也包含4个在不同java类中定义的jpanel(panel1,panel2,panel3,panel4)。

如何在用户点击不同的按钮时从主jframe类中调用/显示这些不同的jpanel? 如果我有40-50个这样的jpanel,怎么办?从主类中切换这些面板的最有效方法是什么?在java swing中切换/导航jpanels

+0

你到底在问什么? CardLayout#show'方法如何工作? – Robin

回答

4

这是一个非常简单的示例,它使用next()和一个按钮来更改面板。

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.CardLayout; 

import java.awt.Color; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 

import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.border.Border; 

public class TestCards extends JFrame { 

    private final CardLayout cl = new CardLayout(); 
    private final JPanel cards = new JPanel(cl); 
    private final Border border = BorderFactory.createEmptyBorder(60, 60, 60, 60); 

    public TestCards() { 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 
     contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 

     JPanel panel1 = new JPanel(new GridBagLayout()); 
     panel1.setBorder(border); 
     panel1.setBackground(Color.RED); 
     panel1.add(new JLabel("Card 1")); 
     cards.add(panel1, "First Panel"); 

     JPanel panel2 = new JPanel(new GridBagLayout()); 
     panel2.setBorder(border); 
     panel2.setBackground(Color.GREEN); 
     panel2.add(new JLabel("Card 2")); 
     cards.add(panel2, "Second Panel"); 

     JPanel panel3 = new JPanel(new GridBagLayout()); 
     panel3.setBorder(border); 
     panel3.setBackground(Color.BLUE); 
     panel3.add(new JLabel("Card 3")); 
     cards.add(panel3, "Third Panel"); 

     JButton controlButton = new JButton("Switch"); 
     controlButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.next(cards); 
      } 
     }); 
     JPanel controlPanel = new JPanel(); 
     controlPanel.setBackground(Color.LIGHT_GRAY); 
     controlPanel.add(controlButton); 

     contentPane.add(cards); 
     contentPane.add(controlPanel); 

     cl.show(cards, "First Panel"); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       TestCards frame = new TestCards(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

一种替代(其中许多)是使用3个按钮,其中每一个示出了一个特定的面板(通过使用show代替next)。

有关更多信息,请参见this

+0

+1简单又好的例子! :) –

3

CardLayout的previousnext方法可用于分别通过卡组件向前导航&。为了更容易导航组件非连续,你可以把卡的名字在String阵列:

private static final String[] CARD_NAMES = { "name_2996062106101", ... }; 

然后,显示特定cardIndex,你可以简单地使用:

CardLayout layout = (CardLayout) contentPane.getLayout(); 
layout.show(contentPane, CARD_NAMES[cardIndex]); 

欲了解更多信息,请参阅How to Use CardLayout