【问题标题】:How to access a CardLayout variable from an outside class?如何从外部类访问 CardLayout 变量?
【发布时间】:2014-01-04 13:28:31
【问题描述】:

我有两个类(lay 和 panelTwo)。在“lay”中,我有我的 MainMethod,这是我放置 CardLayout 的地方。我想要做的是在另一个外部类中访问该类。但是我在尝试编写 ActionListener 时似乎无法访问它:

 public class lay {

JFrame frame;
JPanel panelCont;
JPanel panelOne;
JButton buttonOne;
CardLayout cards;

PanelTwo panelTwo;

public lay() {
    frame = new JFrame("Start");
    panelCont = new JPanel();
    panelOne = new JPanel();
    panelTwo = new PanelTwo();
    buttonOne = new JButton("Got to two");
    cards = new CardLayout();

    panelCont.setLayout(cards);

    panelOne.add(buttonOne);
    panelOne.setBackground(Color.BLUE);

    panelCont.add(panelOne, "1");
    panelCont.add(panelTwo, "2");
    cards.show(panelCont, "1");

    buttonOne.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            cards.show(panelCont, "2");
        }
    });

    frame.add(panelCont);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new lay();
        }
    });
}

}

这是我的另一个问题所在的班级:

public class PanelTwo extends JPanel {

JButton buttonTwo;

public PanelTwo() {

    buttonTwo = new JButton("Go to one");

    add(buttonTwo);
    setBackground(Color.GREEN);

    buttonTwo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            cards.show(panelCont, "1");
        }
    });


    }

}

如您所知,我在“cards.show(panelCont, "1")”中遇到错误。我明白为什么会这样。我只是不知道解决方案是什么。

【问题讨论】:

    标签: java swing jpanel cardlayout


    【解决方案1】:

    他们需要在不同的文件中吗?您可以使 PanelTwo 成为 lay 类的内部类。您收到错误消息,因为两个变量不在 lay 类的范围内,这些变量是它们的成员。如果您执行以下操作,错误就会消失。

    public class lay {
       ...
       private class PanelTwo {
    
       }
    }
    

    编辑

    使用两个单独的类文件需要做的是在PanelTwo 中创建一个构造函数,您可以在其中从lay 类中获取CardLayoutJPanel 的参数。然后用这两个参数实例化PanelTwo

    试试这个。我将CardLayoutJPanel 传递给PanelTwo 的构造函数。工作正常。

    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class lay {
    
        JFrame frame;
        JPanel panelCont;
        JPanel panelOne;
        JButton buttonOne;
        CardLayout cards;
    
        PanelTwo panelTwo;
    
        public lay() {
            frame = new JFrame("Start");
            panelCont = new JPanel();
            panelOne = new JPanel();
            cards = new CardLayout();
            panelTwo = new PanelTwo(cards, panelCont);
            buttonOne = new JButton("Got to two");
    
    
            panelCont.setLayout(cards);
    
            panelOne.add(buttonOne);
            panelOne.setBackground(Color.BLUE);
    
            panelCont.add(panelOne, "1");
            panelCont.add(panelTwo, "2");
            cards.show(panelCont, "1");
    
            buttonOne.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    cards.show(panelCont, "2");
                }
            });
    
            frame.add(panelCont);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new lay();
                }
            });
        }
    
    }
    
    class PanelTwo extends JPanel {
    
        JButton buttonTwo;
        CardLayout layout;
        JPanel panelCont;
    
        public PanelTwo(final CardLayout layout, final JPanel panelCont) {
            this.layout = layout;
            this.panelCont = panelCont;
            buttonTwo = new JButton("Go to one");
    
            add(buttonTwo);
            setBackground(Color.GREEN);
    
            buttonTwo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    layout.show(panelCont, "1");
                }
            });
    
        }
    }
    

    我还在lay 构造函数中初始化了CardLayout初始化PanelTwo。这避免了NullPointerException

    【讨论】:

    • 是的,它们需要位于不同的文件中。
    • 当我按下“转到两个”时,它会正确执行。但是当我按下“转到一个”按钮时,我得到 NullPointerException。
    • 阅读我回答的最后一部分。并仔细盯着lay 构造函数。
    • 现在我明白了!谢谢!完美运行! :)
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 2012-09-03
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多