Предыдущая функция CardLayout не работает?

1

Следующая функция моего cardlayout работает нормально, но предыдущий isnt. Насколько мне известно, просто "layout.previous(_)"; в body объекта actionPerformed в моем методе makePanel() должен работать, но когда я запускаю свою программу и нажимаю кнопку prev, ничего не происходит. Что я делаю не так? -

import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;


public class Temp
{
    public static void main (String[] args)
    {
        new MakeAQuiz();
    }

    static class MakeAQuiz 
{

    private JPanel start, base, fields, buttonz, question;
    private String [] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "};
    private JButton [] buttons = {new JButton("<<Go back"), new JButton("I'm done"), new JButton("Next>>")};
    private JFrame makeFrame;

    public MakeAQuiz()
    {
        start = new JPanel(new CardLayout());
        start.add(makePanel(),"1");

        makeFrame = new JFrame();
        makeFrame.setSize(500,600);
        makeFrame.add(start);
        makeFrame.setVisible(true);
        makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    }

    public JFrame getJFrame()
    {
        return makeFrame;
    }

    public JPanel makePanel()
    {
        question = new JPanel(new FlowLayout());
        fields = new JPanel(new GridBagLayout());
        buttonz = new JPanel(new FlowLayout());
        base = new JPanel(new BorderLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.weighty=0.5; //adds padding between the fields vertically

        for (int i = 1; i<5; i++)
        {
            c.gridy++; //puts each field in a seperate line/row
            JLabel label = new JLabel(labels[i]);
//            c.fill = GridBagConstraints.HORIZONTAL;
            fields.add(label,c);
            JTextField textField = new JTextField(20);
            fields.add(textField,c); 
        }


        final CardLayout layout = (CardLayout)start.getLayout();    

        buttons[1].addActionListener(new ActionListener() {
//            @Override
            public void actionPerformed(ActionEvent e) {
                buttons[0].setEnabled(false);
                buttons[2].setEnabled(false);
//                for(Component comp : cardPanel.getComponents()) {
//                    if(comp instanceof Page) {
//                        Page page = (Page)comp;
//                        page.printData();
//                    }
//                }
            }
        });

        buttons[2].addActionListener(new ActionListener() 
        {
//        @Override
            public void actionPerformed(ActionEvent e) 
            {
                start.add(makePanel(), String.valueOf(start.getComponentCount() + 1));              
                layout.next(start);
            }
        });

        buttons[0].addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {           
                layout.previous(start);
            }
        });

        buttonz.add(buttons[0]);    
        buttonz.add(buttons[1]);
        buttonz.add(buttons[2]);   

        JLabel l = new JLabel(labels[0]);
        JTextField t = new JTextField(30);
        question.add(l);
        question.add(t);

        base.add(question,BorderLayout.NORTH);
        base.add(buttonz,BorderLayout.SOUTH);
        base.add(fields,BorderLayout.CENTER);

        return base;
    }

}
}
Теги:
user-interface
swing
cardlayout

2 ответа

3
Лучший ответ

У меня нет проблем (с вашим кодом), как только я добавил некоторые дополнительные компоненты в start панель.

Однако у вас будут проблемы, потому что вы добавили кнопки в панель, которые были отображены в CardLayout.

Лучшим решением было бы поместить кнопки в нижней части главного экрана и отделить его от карт.

Вам нужно будет поддерживать какой-то счетчик или ссылку на текущую страницу, поскольку CardLayout не предоставляет никакого способа получить ссылку на текущую карту. Это позволит вам включить/отключить следующие/предыдущие кнопки approritaly...

Обновлен с помощью runnable example...

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MakeAQuiz {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                new MakeAQuiz();
            }
        });
    }

    private JPanel start, base, fields, buttonz, question;
    private String[] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "};
    private JButton[] buttons = {new JButton("<<Go back"), new JButton("I'm done"), new JButton("Next>>")};
    private JFrame makeFrame;

    public MakeAQuiz() {
        start = new JPanel(new CardLayout());
        start.add(makePanel(), "1");

        makeFrame = new JFrame();
        makeFrame.add(start);

        buttonz = new JPanel(new FlowLayout());

        final CardLayout layout = (CardLayout) start.getLayout();

        buttons[1].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                buttons[0].setEnabled(false);
                buttons[2].setEnabled(false);
            }
        });

        buttons[2].addActionListener(new ActionListener() {
      @Override
            public void actionPerformed(ActionEvent e) {
                int count = start.getComponentCount();
                start.add(new JLabel(Integer.toString(count), JLabel.CENTER), Integer.toString(count));
                layout.next(start);
            }
        });

        buttons[0].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                layout.previous(start);
            }
        });

        buttonz.add(buttons[0]);
        buttonz.add(buttons[1]);
        buttonz.add(buttons[2]);

        makeFrame.add(buttonz, BorderLayout.SOUTH);

        makeFrame.pack();
        makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        makeFrame.setVisible(true);
    }

    public JFrame getJFrame() {
        return makeFrame;
    }

    public JPanel makePanel() {
        question = new JPanel(new FlowLayout());
        fields = new JPanel(new GridBagLayout());
        base = new JPanel(new BorderLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.weighty = 0.5; //adds padding between the fields vertically

        for (int i = 1; i < 5; i++) {
            c.gridy++; //puts each field in a seperate line/row
            JLabel label = new JLabel(labels[i]);
//            c.fill = GridBagConstraints.HORIZONTAL;
            fields.add(label, c);
            JTextField textField = new JTextField(20);
            fields.add(textField, c);
        }

        JLabel l = new JLabel(labels[0]);
        JTextField t = new JTextField(30);
        question.add(l);
        question.add(t);

        base.add(question, BorderLayout.NORTH);
        base.add(fields, BorderLayout.CENTER);

        return base;
    }

}
  • 0
    «Однако у вас будут проблемы, потому что вы добавили кнопки на панель, отображаемую в CardLayout». Извините, я не уверен, понимаю ли я, что вы имеете в виду здесь. Кнопки добавлены на панель buttonz. Это то, что вы имели ввиду?
  • 1
    Исходя из вашего примера, кнопки добавляются в панель, созданную в методе makePanel , которая затем добавляется в панель ( start ), которой назначен CardLayout . При нажатии кнопки «Следующая / Предыдущая» появится следующая / предыдущая панель, а кнопки исчезнут. Я знаю, что вы думаете о добавлении кнопок к каждой «карточке», но это действительно очень плохая идея, поскольку она дублирует функциональность, которая просто не требуется ...
Показать ещё 8 комментариев
0

Нет. Я думаю, что это не сработает. Просто нажатие предыдущей кнопки ничего не вернет. Вы должны сохранять свои записи в другом месте и загружать их в соответствующие поля при нажатии на предыдущую кнопку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню