【问题标题】:Toggling/navigating jpanels in java swings在java swings中切换/导航jpanels
【发布时间】:2012-10-06 16:39:47
【问题描述】:
  • > 我在包'abc'中定义了一个jframe。这个 jframe 也可以作为一个主类。
  • >同一个包'abc'还包含4个jpanel(panel1,panel2,panel3,panel4)定义在不同的java类中。

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

【问题讨论】:

  • 你到底在问什么? CardLayout#show 方法是如何工作的?

标签: java swing layout jpanel


【解决方案1】:

这是一个非常简单的例子,它使用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 了解更多信息。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 2013-03-28
      • 1970-01-01
      • 2020-12-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多