您如何在不在 java 中创建新实例的情况下引用您的 GUI?

How do you reference your GUI without creating a new instance in java?

您好,我的程序有问题,我找不到答案。基本上我已经很努力了,Whosebug 是我最后的希望.....我想我明白了这个问题,但不知道如何解决它......

所以我有一个 GUI,上面有一个 JCalendar。我想根据用户的选择在每周计划数据库中创建一个新的 table。但是,当我将用户选择的日期发送到方法时,它会将日期重置回当前日期。我 99% 确定这是因为我每次 运行 使用此方法时都会创建一个新的 gui 实例。 (我自学了java两个半月所以不是高手)

无论如何,我的问题是如何在 gui 中引用方法 getSelectedDate 而不必创建 gui 的新实例?????我已经查看了我能找到的所有教程等,但还没有任何帮助我......

如有任何意见建议,将不胜感激......再次感谢......

public  void createSchedule() {


              try {
                 this.doConnect();

                 stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
                SchedulerGUI gui = new SchedulerGUI();
                 Calendar cal = Calendar.getInstance();
                cal.setTime(gui.getSelectedDate());
                 int WeekNum = cal.get(Calendar.WEEK_OF_YEAR);
                 int year = cal.get(Calendar.YEAR);

                 String DatabaseString = "CREATE TABLE " + Integer.toString(year) + "_week_" + Integer.toString(WeekNum) + " (PeriodNum INT DEFAULT 1  NOT NULL, Monday VARCHAR(30), Tuesday VARCHAR(30), Wednesday VARCHAR(30), Thursday VARCHAR(30), Friday VARCHAR(30), Saturday VARCHAR(30), Sunday VARCHAR(30), PRIMARY KEY (PeriodNum))";
                 System.out.println(DatabaseString);

               // stmt.executeUpdate(DatabaseString); ------- I  have this //'d out so that I'm not creating a new table every time a new weeks starts. So I don't jump for joy thinking I've fixed it! :)


             } catch (SQLException ex) {
                 Logger.getLogger(Methods.class.getName()).log(Level.SEVERE, null, ex);
                  JOptionPane.showMessageDialog(null, "This schedule already exists. Please update it or select another week.");
             }   finally{


                 try {
                  con.close();
                    stmt.close();
                 } catch (SQLException ex) {
                     Logger.getLogger(Methods.class.getName()).log(Level.SEVERE, null, ex);
                 }

我不确定我是否完全理解上下文,但我相信您正在创建 Java 对象日历的实例,它不是 GUI 对象。

您是否尝试过引用现有的 JCalendar GUI 对象?看起来您引用了某种 GUI,但我不太确定那是 JCalendar。

要直接回答您的问题,对 gui 的引用应该是 class createSchedule() 所属的任何成员。如果 GUI 创建此对象,它可以传递对自身的引用。确保它仅在其构造函数 returns 之后执行此操作;否则你会从构造函数中泄漏 this,这很糟糕。

一种更复杂的方法是让 GUI 传入 SwingPropertyChangeSupport 的实例。您的程序逻辑会将 属性 事件注入其中,GUI 会监听它们并自行更新。

基本上,更改 createSchedule 方法,这样您就必须将它需要的信息传递给它,它会传回您需要的信息(如果需要)

public void createSchedule(Date date) {

    try (Connection con = doConnect()) {
        try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            int WeekNum = cal.get(Calendar.WEEK_OF_YEAR);
            int year = cal.get(Calendar.YEAR);

            String DatabaseString = "CREATE TABLE " + Integer.toString(year) + "_week_" + Integer.toString(WeekNum) + " (PeriodNum INT DEFAULT 1  NOT NULL, Monday VARCHAR(30), Tuesday VARCHAR(30), Wednesday VARCHAR(30), Thursday VARCHAR(30), Friday VARCHAR(30), Saturday VARCHAR(30), Sunday VARCHAR(30), PRIMARY KEY (PeriodNum))";
            stmt.executeUpdate(DatabaseString);
        }
    } catch (SQLException ex) {
        Logger.getLogger(Methods.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(null, "This schedule already exists. Please update it or select another week.");
    }

此外,请查看 The try-with-resources Statement 以获得更好的资源管理方法