【问题标题】:JPanel on CardLayout Swing JavaCardLayout Swing Java 上的 JPanel
【发布时间】:2017-04-06 13:45:14
【问题描述】:

我是 Java 新手,我正在 Swing 中通过 CardLayout 进行导航。基本上我在JFrame 上有两个按钮,当我单击一个按钮时,它应该转到卡 1,我在 JPanelcard1 上保留了两个按钮,当我单击另一个按钮时,它应该转到卡 2我在card2 面板上保留了JTextField。但它没有发生。

谁能解决?

我的代码如下。

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

public class CardLayoutTest extends JFrame implements ActionListener {
    JFrame f;
    JButton b;
    JButton c;
    JPanel panel;
    JPanel cards;
    JPanel card1;
    JPanel card2;
    CardLayout card;  
    Container pane;     
    final String card1Text = "One";
    final String card2Text = "Two";

    CardLayoutTest() {

     }  

    public void passBtn() {
        f=new JFrame("Card Layout Test");

        card1 = new JPanel();
        card1.add(new JButton("Button 1 - Card 1"));
        card1.add(new JButton("Button 2 - Card 1"));
        card1.setBackground(new Color(255,0,0));

        card2 = new JPanel();
        card2.add(new JTextField("TextField on Card 2", 20));
        card2.setBackground(new Color(0,255,0)); 

        //Create the panel that contains the "cards".
        cards = new JPanel(new CardLayout());
        cards.add(card1, card1Text);
        cards.add(card2, card2Text); 

        b = new JButton("Page 1");
        b.setBounds(50,50,70,30);        
        b.setBackground(Color.red);

        c = new JButton("Page 2");
        c.setBounds(50,80,70,30);        
        c.setBackground(Color.blue);

        pane = f.getContentPane();
        pane.add(cards, BorderLayout.CENTER);

        b.addActionListener(new ActionListener(){  
                public void actionPerformed(ActionEvent e) {                                    
                    card.show(card1, card1Text);                    
                }
        });

        c.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e) {                                    
                card.show(card2, card2Text);                
            }
    });
        f.add(b); f.add(c); f.add(panel); f.add(cards);
    }

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

【问题讨论】:

标签: java swing layout-manager cardlayout


【解决方案1】:

试试:

card = new CardLayout();
cards = new JPanel(card);

而不是cards = new JPanel(new CardLayout());

更新

public class CardLayoutTest extends JFrame {
    JButton b;
    JButton c;
    JPanel cards;
    JPanel card1;
    JPanel card2;
    CardLayout card;
    final String card1Text = "One";
    final String card2Text = "Two";

    CardLayoutTest() {
        super();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        passBtn();
    }

    public void passBtn() {
        card1 = new JPanel();
        card1.setBackground(new Color(255,0,0));

        card2 = new JPanel();
        card2.add(new JTextField("TextField on Card 2", 20));
        card2.setBackground(new Color(0, 255, 0));

        //Create the panel that contains the "cards".
        card = new CardLayout();
        cards = new JPanel(card);
        cards.add(card1, card1Text);
        cards.add(card2, card2Text);

        b = new JButton("Page 1");
        b.setBounds(50, 50, 70, 30);
        b.setBackground(Color.red);
        card1.add(b);
        c = new JButton("Page 2");
        c.setBounds(50, 80, 70, 30);
        c.setBackground(Color.blue);
        card1.add(c);
        add(cards);
        card.show(cards, card1Text);

        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    card.show(cards, card1Text);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });

        c.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    card.show(cards, card2Text);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) {
        CardLayoutTest cardLayoutTest = new CardLayoutTest();
        cardLayoutTest.setVisible(true);
    }
}

【讨论】:

  • cards = new JPanel(new CardLayout()); 有什么问题?
  • 你没有分配给你的字段,而不是在你的动作监听器中使用空值
  • 代码如果充满错误。 cards = new JPanel(new CardLayout()); 不是错误,按照你的建议去做并不能解决问题。
  • 你好ZhenyaM。谢谢它的工作原理。我也想在卡 2 上有 b 和 c 按钮。所以,我添加了 card2.add(b);和card2.add(c)。但它显示一个空白页。但是,如果我创建一个名为“d”的新按钮并添加为 card2.add(d),它就可以工作。由于我有很多卡片,而且导航常用的按钮很多,所以我想对所有面板使用通用按钮。有没有可能。
  • 如果我理解正确,你不能在几个面板上添加一个按钮——它不会起作用。但是您可以为几个按钮添加一个 ActionListener 并获得预期的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2013-10-07
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多