为了账号安全,请及时绑定邮箱和手机立即绑定

与父 JPanel 通信

与父 JPanel 通信

侃侃无极 2021-08-06 10:20:07
我正在使用 Swing 和 MVC 设计模式创建一个 Java 应用程序。该应用程序设计如下:有一个类QuizPanel扩展JPanel. 此面板是包含我的应用程序的主要“屏幕”的容器。我的应用程序的每个“屏幕”都是一个单独的类,扩展JPanel. QuizPanel根据需要添加/删除这些 JPanel 。顶层QuizPanel实现了我的接口Switchable。该Switchable接口由单个SwitchView(ViewState state)方法组成。我传递this给在QuizPanel顶级面板中实例化的每个“屏幕” ,因此它们能够在SwitchView按下按钮时进行调用。在登录屏幕上,用户输入 pin 和学生 ID,如果它们与数据库中的令牌匹配,我需要将Token对象传递到我的应用程序的另一个屏幕(我尚未实现的问题屏幕)或拥有它以某种方式可用。从嵌入式 Derby 数据库中检索令牌。我能想到的唯一方法是创建一个带有静态Token变量的实用程序类,其他类可以访问它(这似乎是一种讨厌的方法)。我是否因为我的应用程序的设计有缺陷而遇到了这个问题?有没有什么技术可以用来Token在我的应用程序的不同屏幕上传递?主要的public static void main(String[] args) {    QuizPanel quizPanel = new QuizPanel();    JFrame frame = new JFrame("Quiz");    frame.setPreferredSize(new Dimension(400, 400));    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.add(quizPanel);    frame.pack();    frame.setLocationRelativeTo(null);    frame.setVisible(true);}
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我认为在这种情况下您可以使用Singleton 模式。这种模式应该尽可能少地使用,但在你的情况下(必须从不同类别的应用程序访问的公共信息)你可以使用它(恕我直言)。

但在您的情况下,您也可以使用一种 Swing 功能。

  1. 任何 Swing 窗口都有一个根窗格。JComponent窗口中的每个布局都可以访问此窗格。

  2. JComponent还可以在地图中存储一些用户数据,称为“客户端属性”。因为JRootPane扩展JComponent 你可以存储/检索你的令牌是这张地图。

这是一个简单的代码:

public class TokenUtils {


    private static final String TOKEN_PROPERTY = "token";


    public static Token findToken(JComponent component) {

        JRootPane root = component.getRootPane();

        if (root != null) {

            return Token.class.cast(root.getClientProperty(TOKEN_PROPERTY));

        }

       return null;

    }


    public static void putToken(JComponent component, Token token) {

        JRootPane root = component.getRootPane();

        if (root != null) {

            root.putClientProperty(TOKEN_PROPERTY, token);

        }

    }

}

重要提示:如果您使用多个窗口,则必须将令牌放入每个窗口中。


查看完整回答
反对 回复 2021-08-06
?
月关宝盒

TA贡献1772条经验 获得超5个赞

将令牌的值传递给父 JPanel 的方法是在您的界面中添加一个方法,如 setToken(int token) 和测验面板中的全局变量


测验面板:


private int token;

@Override

public void setToken(int token){

     this.token = token;

}

切换界面:


public void setToken(int token);

登录:


parentView.setToken(token);

比您parentView.setToken(token)在 LoginController 中说的要多。现在将设置 QuizPanel 中的令牌变量。


查看完整回答
反对 回复 2021-08-06
  • 2 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信