Вопрос по java, swing – Как показать разные карты в CardLayout?

5

Я посмотрел на пример кода, который использовал этот код:

cl.show(cardPanel, "" + (currentCard));

Но когда я используюshow Я получаю сообщение в Eclipse, что оно устарело, и мне интересно, есть ли другой способ показать разные карты в CardLayout, когда я нажимаю на кнопки? Ниже приведен код для моего класса CardLayout. Предложения также приветствуются, если какая-то часть кода является плохой практикой. Спасибо!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class CardLayoutTest extends JFrame implements ActionListener {

// Ref
 private JPanel cardPanel, jp1, jp2, buttonPanel;
 private JLabel jl1, jl2;
 private JButton btn1, btn2;
 private CardLayout cardLayout;

// Konstruktor
 public CardLayoutTest()
 {
     setTitle("Test med CardLayout");
     setSize(600,400);

     cardPanel = new JPanel();
     buttonPanel = new JPanel();

     cardPanel.setLayout(cardLayout);

     jp1 = new JPanel();
     jp2 = new JPanel();

     jl1 = new JLabel("Card 1");
     jl2 = new JLabel("Card 2");

     jp1.add(jl1);
     jp2.add(jl2);

     cardPanel.add(jp1, "1");
     cardPanel.add(jp2, "2");

     btn1 = new JButton("Show Card 1");
     btn2 = new JButton("Show Card 2");

     buttonPanel.add(btn1);
     buttonPanel.add(btn2);

     getContentPane().add(cardPanel, BorderLayout.NORTH);
     getContentPane().add(buttonPanel, BorderLayout.SOUTH);

     btn1.addActionListener(this);
 }

     public void actionPerformed(ActionEvent event)
     {
        // ??? Show card 1 ???

        // ??? Show card 2 ???
     }

 public static void main(String[] args) {
     CardLayoutTest frame = new CardLayoutTest();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    } 
}

Ваш Ответ

2   ответа
8

Метод show () существовал в JPanel (точнее, Component) и был заменен на setVisible (). Это полностью отличается от метода show () CardLayout.

Убедитесь, что вы делаете что-то вроде следующего в своем слушателе действий

CardLayout cardLayout = (CardLayout)(cardPanel.getLayout());
cardLayout.show(cardPanel, "CardToShow");

Как примечание, не похоже, что вы «обновляете» свой CardLayout. Убедитесь, что вы делаете это.

Да, я пропустил «обновление» моего CardLayout, и я также сделал несколько ошибок в шоу! Благодарность 3D-kreativ
14

Java7 show (родительский контейнер, строковое имя) или Java6 show (родительский контейнер, строковое имя) амортизируется

зависит еслиcurrentCard возвращаетString отcl.show(cardPanel, "" + (currentCard));

EDIT (я попробовал твой пример кода)

1.вы забыли инициализировать самую важную переменную

private CardLayout cardLayout = new CardLayout();

2. затем SSCCE может быть

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class CardLayoutTest extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel cardPanel, jp1, jp2, buttonPanel;
    private JLabel jl1, jl2;
    private JButton btn1, btn2;
    private CardLayout cardLayout = new CardLayout();

    public CardLayoutTest() {
        setTitle("Test med CardLayout");
        setSize(400, 300);
        cardPanel = new JPanel();
        buttonPanel = new JPanel();
        cardPanel.setLayout(cardLayout);
        jp1 = new JPanel();
        jp2 = new JPanel();
        jl1 = new JLabel("Card 1");
        jl2 = new JLabel("Card 2");
        jp1.add(jl1);
        jp2.add(jl2);
        cardPanel.add(jp1, "1");
        cardPanel.add(jp2, "2");
        btn1 = new JButton("Show Card 1");
        btn1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                cardLayout.show(cardPanel, "1");
            }
        });
        btn2 = new JButton("Show Card 2");
        btn2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                cardLayout.show(cardPanel, "2");
            }
        });
        buttonPanel.add(btn1);
        buttonPanel.add(btn2);
        add(cardPanel, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CardLayoutTest frame = new CardLayoutTest();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}
Спасибо за новый код! Работает хорошо! Но у меня есть несколько вопросов о некоторых добавленных вами строках, таких как эта: private static final long serialVersionUID = 1L; Я вижу, что я удалил желтый предупреждающий треугольник в Eclipse, но что он делает? И вы также заменили эту строку: getContentPane (). Add (cardPanel, BorderLayout.NORTH); с этим: добавить (cardPanel, BorderLayout.NORTH); какая разница? И, наконец, не могли бы вы быть добрым и объяснить, что вы сделали в основном методе? Благодарность 3D-kreativ

Похожие вопросы