4
  • >パッケージ'abc'でjframeが定義されています。このjframeはメインクラスとしても機能します。
  • >同じパッケージ'abc'には、異なるJavaクラスで定義された4つのjpanel(panel1、panel2、panel3、panel4)も含まれています。

ユーザーがさまざまなボタンをクリックしたときに、メインのjframeクラスからこれらのさまざまなjpanelを呼び出す/表示する方法を教えてください。このようなjpanelが40〜50個ある場合はどうなりますか?これらのパネルをメインクラスから切り替える最も効率的な方法は何でしょうか。

4

2 に答える 2

4

next()これは、パネルを変更するために1つのボタンを使用する非常に単純な例です。

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)。

詳細については、こちらをご覧ください。

于 2012-10-06T17:57:08.687 に答える
3

CardLayoutpreviousnextメソッドを使用して、カードコンポーネントをそれぞれ前後に移動できます。コンポーネントを連続してナビゲートしやすくするために、カード名をString配列に配置できます。

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

次に、特定のを表示するには、次のcardIndexように使用できます。

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

詳細については、CardLayoutの使用方法を参照してください。

于 2012-10-06T17:56:24.373 に答える