HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Card layout in Java

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
javacardlayout

Problem

I have a JPanel (mainPanel) with CardLayout which contains 4 JPanels (childPanel).

Each childPanel contains:

  • a JPopupMenu with 4 JMenuItems to switch between the childPanels (First,Last,Next,Previous)



  • a label with the time when it got visible



  • a toggleButton that shows/hides the label



I created this working version but I think it can be optimized. Any advice is welcome.

```
public final class Prozor extends JFrame
{
private static final Dimension SIZE = new Dimension(400, 300);

private final JPanel panelButtoni = new JPanel();
private JButton prvi;
private JButton zadnji;
private JButton sljedeci;
private JButton prethodni;

private CardLayout cardLayout = new CardLayout();
private JPanel panelCards = new JPanel(cardLayout);

private JPopupMenu crveniMeni= new JPopupMenu();
private JPanel crveniPanel= new JPanel();
private JPopupMenu crveniKontekstni= new JPopupMenu();
private JLabel crvenaLabelica = new JLabel();
private JToggleButton crveniButton;

private JPopupMenu plaviMeni= new JPopupMenu();
private JPanel plaviPanel = new JPanel();
private JPopupMenu plaviKontekstni = new JPopupMenu();
private JLabel plavaLabelica = new JLabel();
private JToggleButton plaviButton;

private JPopupMenu zeleniMeni = new JPopupMenu();
private JPanel zeleniPanel = new JPanel();
private JPopupMenu zeleniKontekstni = new JPopupMenu();
private JLabel zelenaLabelica = new JLabel();
private JToggleButton zeleniButton;

private JPopupMenu zutiMeni= new JPopupMenu();
private JPanel zutiPanel = new JPanel();
private JPopupMenu zutiKontekstni = new JPopupMenu();
private JLabel zutaLabelica = new JLabel();
private JToggleButton zutiButton;

public Prozor(String title)
{
super(title);
setPreferredSize(SIZE);
setMinimumSize(SIZE);
setMaximumSize(SIZE);
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(n

Solution

I found the answer and have posted it in case someone has a similar problem:

I created a class that extends JPanel like this:

public class CardPanel extends JPanel{
    private JPopupMenu menu;
    private JLabel label;
    private JToggleButton button;
    private final CardLayout layout;
    private final JPanel parent;

    public CardPanel(CardLayout layout,Color color,JPanel parent)
    {
        super();
        this.layout = layout;
        this.parent=parent;
        setBackground(color);

        kreirajKontekstni();

    }

    private void kreirajKontekstni() {
        button =new JToggleButton("Prikazi vrijeme");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                if (button.isSelected()) {
                    label.setText(Calendar.getInstance().getTime().toString());
                    label.setVisible(true);
                }else{
                    label.setVisible(false);
                }
            }
        });
        JMenuItem jmPrvi = new JMenuItem("Prvi");
        jmPrvi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.first(parent);
            }
        });
        JMenuItem jmZadnji = new JMenuItem("Zadnji");
        jmZadnji.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.last(parent);
            }
        });
        JMenuItem jmSljedeci = new JMenuItem("Sljedeći");
        jmSljedeci.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.next(parent);
            }
        });
        JMenuItem jmPrethodni = new JMenuItem("Prethodni");
        jmPrethodni.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.previous(parent);
            }
        });

        addMouseListener(new MouseAdapter() 
        {

            @Override
            public void mouseReleased(MouseEvent me) {
                if (me.isPopupTrigger()) {
                    menu.show(me.getComponent(), me.getX(), me.getY());
                }
            }

        });

        menu.add(jmPrvi);
        menu.add(jmZadnji);
        menu.add(jmPrethodni);
        menu.add(jmSljedeci);
        add(menu);
        add(label);
        add(button);
        parent.add(this);
    }

}


and changed the code in the main Window to:

```
public class SimpleProzor extends JFrame
{
private static final Dimension SIZE = new Dimension(400, 300);

private final JPanel panelButtoni = new JPanel();
private JButton prvi;
private JButton zadnji;
private JButton sljedeci;
private JButton prethodni;

private CardLayout cardLayout = new CardLayout();
private JPanel panelCards = new JPanel(cardLayout);

private CardPanel crveniPanel;
private CardPanel plaviPanel;
private CardPanel zeleniPanel;
private CardPanel zutiPanel;

public SimpleProzor(String title)
{
super(title);
setPreferredSize(SIZE);
setMinimumSize(SIZE);
setMaximumSize(SIZE);
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
kreirajbuttonAkcije();

crveniPanel = new CardPanel(cardLayout, Color.RED, panelCards);
plaviPanel = new CardPanel(cardLayout, Color.BLUE, panelCards);
zeleniPanel = new CardPanel(cardLayout, Color.GREEN, panelCards);
zutiPanel= new CardPanel(cardLayout, Color.YELLOW, panelCards);

this.add(panelCards);

pack();
}

public static void main(String[] args)
{
Prozor p = new Prozor("ime");
p.setVisible(true);
}

private void kreirajbuttonAkcije() {
prvi= new JButton("Prvi");
prvi.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae)
{
cardLayout.first(panelCards);
}
});

zadnji= new JButton("Zadnji");
zadnji.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae)
{
cardLayout.last(panelCards);
}
});

sljedeci= new JButton("Sljedeći");
sljedeci.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae)
{
cardLayout.next(panelCards);
}
});

prethodni= new JButton("Prethodni");
prethodni.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae)
{
cardLayout.previous(panelCard

Code Snippets

public class CardPanel extends JPanel{
    private JPopupMenu menu;
    private JLabel label;
    private JToggleButton button;
    private final CardLayout layout;
    private final JPanel parent;

    public CardPanel(CardLayout layout,Color color,JPanel parent)
    {
        super();
        this.layout = layout;
        this.parent=parent;
        setBackground(color);

        kreirajKontekstni();


    }

    private void kreirajKontekstni() {
        button =new JToggleButton("Prikazi vrijeme");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                if (button.isSelected()) {
                    label.setText(Calendar.getInstance().getTime().toString());
                    label.setVisible(true);
                }else{
                    label.setVisible(false);
                }
            }
        });
        JMenuItem jmPrvi = new JMenuItem("Prvi");
        jmPrvi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.first(parent);
            }
        });
        JMenuItem jmZadnji = new JMenuItem("Zadnji");
        jmZadnji.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.last(parent);
            }
        });
        JMenuItem jmSljedeci = new JMenuItem("Sljedeći");
        jmSljedeci.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.next(parent);
            }
        });
        JMenuItem jmPrethodni = new JMenuItem("Prethodni");
        jmPrethodni.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                layout.previous(parent);
            }
        });

        addMouseListener(new MouseAdapter() 
        {

            @Override
            public void mouseReleased(MouseEvent me) {
                if (me.isPopupTrigger()) {
                    menu.show(me.getComponent(), me.getX(), me.getY());
                }
            }


        });

        menu.add(jmPrvi);
        menu.add(jmZadnji);
        menu.add(jmPrethodni);
        menu.add(jmSljedeci);
        add(menu);
        add(label);
        add(button);
        parent.add(this);
    }

}
public class SimpleProzor extends JFrame
{
    private static final Dimension SIZE = new Dimension(400, 300);

    private final JPanel panelButtoni = new JPanel();
    private JButton prvi;
    private JButton zadnji;
    private JButton sljedeci;
    private JButton prethodni;

    private CardLayout cardLayout = new CardLayout();
    private JPanel panelCards = new JPanel(cardLayout);

    private CardPanel crveniPanel;
    private CardPanel plaviPanel;
    private CardPanel zeleniPanel;
    private CardPanel zutiPanel;

    public SimpleProzor(String title)
    {
        super(title);
        setPreferredSize(SIZE);
        setMinimumSize(SIZE);
        setMaximumSize(SIZE);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        kreirajbuttonAkcije();

        crveniPanel = new CardPanel(cardLayout, Color.RED, panelCards);
        plaviPanel = new CardPanel(cardLayout, Color.BLUE, panelCards);
        zeleniPanel = new CardPanel(cardLayout, Color.GREEN, panelCards);
        zutiPanel= new CardPanel(cardLayout, Color.YELLOW, panelCards);

        this.add(panelCards);

        pack();
    }

    public static void main(String[] args)
    {
        Prozor p = new Prozor("ime");
        p.setVisible(true);
    }

    private void kreirajbuttonAkcije() {
        prvi= new JButton("Prvi");
        prvi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                cardLayout.first(panelCards);
            }
        });

        zadnji= new JButton("Zadnji");
        zadnji.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                cardLayout.last(panelCards);
            }
        });

        sljedeci= new JButton("Sljedeći");
        sljedeci.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                cardLayout.next(panelCards);
            }
        });

        prethodni= new JButton("Prethodni");
        prethodni.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                cardLayout.previous(panelCards);
            }
        });

        panelButtoni.add(prvi);
        panelButtoni.add(zadnji);
        panelButtoni.add(prethodni);
        panelButtoni.add(sljedeci);
        this.add(panelButtoni,BorderLayout.NORTH);   
    }   
}

Context

StackExchange Code Review Q#41988, answer score: 5

Revisions (0)

No revisions yet.