从嵌套组件调用的方法访问JFrame字段

问题描述 投票:-1回答:1

给出一个具有以下结构的扩展JFrame的类:

ContentPane of Class extending JFrame
|-JPanel
 |-JButton
|-Jpanel
 |-JButton
 |-JTextField

该类的ContentPane具有两个JPanel,而该类具有powerLevel整数字段。

第一个JPanel具有一个JButton,该JButton应该调用实现ActionListener的类。此类的actionPerformed()方法应将powerLevel加1。

第二个JPanel有一个按钮,当按下该按钮时,应调用一个ActionListener,该监听器将在JTextField中显示powerLevel的值,该JTextField是同一JPanel的第二个组件。

我对GUI Java编程非常陌生,我不确定这是否可行。我认为在更改结构之前,我将获得更丰富的意见。我之所以使用这种结构,是因为它更容易控制布局的外观。

提前感谢。

java swing jframe components
1个回答
0
投票

有许多方法可以实现所需的功能。一种简单的解决方案是使用嵌套类。嵌套类可以访问持有类的类成员。在一个文件mre中演示了该解决方案(可以将整个代码复制粘贴到SwingMain.java中并运行):

import java.awt.BorderLayout;
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.JTextField;

public class SwingMain {

    private int powerLevel  = 0;

    SwingMain() {
        creategui();
    }

    void creategui(){

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(new APanel(), BorderLayout.PAGE_START);
        f.add(new BPanel(), BorderLayout.PAGE_END);
        f.pack();
        f.setVisible(true);
    }

    class APanel extends JPanel{

        APanel() {
            JButton increment = new JButton("Increment");
            increment.addActionListener(new AActionLIstener());
            add(increment);
        }

        class AActionLIstener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                powerLevel++;
            }
        }
    }

    class BPanel extends JPanel{

        private final JTextField tf;

        BPanel() {
            JButton show = new JButton("Show");
            show.addActionListener(new BActionLIstener());
            add(show);
            tf = new JTextField(String.valueOf(powerLevel),3);
            add(tf);
        }

        class BActionLIstener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                tf.setText(String.valueOf(powerLevel));
            }
        }
    }

    public static void main(String[] args) {
        new SwingMain();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.