繁体   English   中英

调用方法以设置可见的JFrame时出错

[英]Error when calling method to set a JFrame visible

我正在使用Eclipse Kepler,并且我有一个应用程序,该应用程序实例了两个JFrame实例,其中一个实例此时不可见,因为我将通过另一种检查方法使其对用户可见。 但是,当我运行它时,什么也没有发生,但是当我调试它时,它在执行mainWindow.setFrameListOfActivities()时出现此错误:

InvocationEvent.dispatch() line: not available 'Source not Found'

这是我的代码:

mainWindow ,实例化了我的框架,然后实例化了updateActivitiesToRun

package view;

import java.awt.EventQueue;

public class mainWindow extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private JPanel contentPane;
    private JFormattedTextField ftfAlertTime;
    private JFormattedTextField ftfScheduledTime;
    private JTextArea txtGsdDescription;
    private JFormattedTextField ftfGsdNumber;
    private static JFrame frameListOfActivities;


    public static JFrame getFrameListOfActivities() {
        return frameListOfActivities;
    }

    public static void setFrameListOfActivities() {
        frameListOfActivities.setVisible(true);
    }

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mainWindow frame = new mainWindow();
                    frame.setVisible(true);
                    frame.setLocationRelativeTo(null);
                    frame.setResizable(false);

                    //My Second JFrame
                    listActivities frameListOfActivities = new listActivities();
                    frameListOfActivities.setVisible(false);


                    //Starts the scheduler, which checks if there are any activities 
                    ScheduledExecutorService updateActivitiesToRun = Executors.newScheduledThreadPool(1);
                    updateActivitiesToRun.scheduleAtFixedRate(scheduledTask.updateActivitiesToRun, 0, 2, TimeUnit.SECONDS);

                    //Update activities to cancel the notification after their scheduled time
                    //ScheduledExecutorService updatePastScheduledTimeActivities = Executors.newScheduledThreadPool(1);
                    //updatePastScheduledTimeActivities.scheduleAtFixedRate(scheduledTask.updatePastScheduledTimeActivities, 0, 10, TimeUnit.SECONDS);

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        });
    }

    /**
     * Create the frame.
     * @throws Exception 
     */
    public mainWindow() throws Exception {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setBounds(100, 100, 450, 300);

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblGsdNumber = new JLabel("GSD Number:");
        lblGsdNumber.setBounds(10, 11, 89, 14);
        contentPane.add(lblGsdNumber);

        JLabel lblDescription = new JLabel("Description:");
        lblDescription.setBounds(10, 36, 89, 14);
        contentPane.add(lblDescription);

        JLabel lblAlertTime = new JLabel("Alert time:");
        lblAlertTime.setBounds(10, 188, 71, 14);
        contentPane.add(lblAlertTime);

        JLabel lblScheduledTime = new JLabel("Scheduled Time:");
        lblScheduledTime.setBounds(220, 188, 115, 14);
        contentPane.add(lblScheduledTime);

        JButton btnCreateActivity = new JButton("Create Activity");
        btnCreateActivity.addActionListener(new ActionListener() {

            //Create Activity button event
            public void actionPerformed(ActionEvent e) {

                if (ftfGsdNumber.getText().equals("")) {
                    JOptionPane.showMessageDialog(null,"Please provide the number of the activity.");
                    ftfGsdNumber.requestFocus();                    

                } else {
                    int validation = Integer.parseInt(ftfScheduledTime.getText().replace(":", ""));

                    if (validation > 2359) {
                        JOptionPane.showMessageDialog(null,"Please provide a valid time schedule for the activity, between 00:00 and 23:59.");
                        ftfScheduledTime.requestFocus();

                    } else {

                        //Confirmation message
                        int result = JOptionPane.showConfirmDialog(null, 
                                   "Confirm details of the new activity?",null, JOptionPane.YES_NO_OPTION);

                        if (result == JOptionPane.YES_OPTION){

                            try{

                                DatabaseQueries.writeActivity(DatabaseQueries.databaseConnect(), ftfGsdNumber.getText(),
                                        txtGsdDescription.getText(), ftfAlertTime.getText(), ftfScheduledTime.getText());

                                //Success Message
                                JOptionPane.showMessageDialog(null,"Activity has been saved successfully");

                                //Clear the txt and formated boxes
                                cleanTextBoxes();

                            }
                            catch(Exception ex) {
                                JOptionPane.showMessageDialog(null, "Unable to insert new activity in database. Error: " + ex);
                            }
                        }
                    }
                }       
            }
        });
        btnCreateActivity.setBounds(148, 228, 133, 23);
        contentPane.add(btnCreateActivity);

        txtGsdDescription = new JTextArea();
        txtGsdDescription.setBounds(10, 61, 414, 116);
        txtGsdDescription.setLineWrap(true);
        contentPane.add(txtGsdDescription);

        ftfAlertTime = new JFormattedTextField();
        ftfAlertTime.setColumns(5);
        ftfAlertTime.setBounds(78, 185, 83, 20);
        contentPane.add(ftfAlertTime);
        createMask(ftfAlertTime);

        ftfScheduledTime = new JFormattedTextField();
        ftfScheduledTime.setColumns(5);
        ftfScheduledTime.setBounds(341, 185, 83, 20);
        contentPane.add(ftfScheduledTime);
        createMask(ftfScheduledTime);   

        ftfGsdNumber = new JFormattedTextField();
        ftfGsdNumber.setBounds(109, 8, 115, 20);
        contentPane.add(ftfGsdNumber);
        createMaskGsd(ftfGsdNumber);

    }

    //Creates the mask of the Scheduled Time and Alert Time
    public void createMask(JFormattedTextField fieldToBeFormated) throws Exception{
        MaskFormatter mask = new MaskFormatter("##:##");
        mask.install(fieldToBeFormated);
    }

    public void createMaskGsd(JFormattedTextField fieldToBeFormated) throws Exception{
        MaskFormatter mask = new MaskFormatter("IN##########");
        mask.install(fieldToBeFormated);
    }

    public void cleanTextBoxes(){
        txtGsdDescription.setText("");
        ftfAlertTime.setText("");
        ftfGsdNumber.setText("");
        ftfScheduledTime.setText("");
    }
}

这是listActivities JFrame的代码:

package view;

import java.awt.event.ActionEvent;

public class listActivities extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private JPanel contentPane;
    private JTable table;

    /**
     * Launch the application.

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    listActivities frame = new listActivities();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    */

    /**
     * Create the frame.
     */
    public listActivities() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 318);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton btnAcknowledge = new JButton("Acknowledge");
        btnAcknowledge.addActionListener(new ActionListener() {

            //Acknowledge button event
            public void actionPerformed(ActionEvent arg0) {



            }
        });
        btnAcknowledge.setBounds(154, 246, 131, 23);
        contentPane.add(btnAcknowledge);

        table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                "GSD Number", "Scheduled Time"
            }
        ) {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;
            boolean[] columnEditables = new boolean[] {
                false, true
            };
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        });
        table.getColumnModel().getColumn(0).setPreferredWidth(114);
        table.getColumnModel().getColumn(1).setPreferredWidth(139);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setBounds(10, 11, 414, 96);
        contentPane.add(table);

        JLabel lblDescription = new JLabel("Description:");
        lblDescription.setBounds(10, 118, 86, 14);
        contentPane.add(lblDescription);

        JTextArea textArea = new JTextArea();
        textArea.setBounds(10, 143, 414, 92);
        textArea.setLineWrap(true);

        contentPane.add(textArea);
    }
}

这是scheduledTask类的代码,在尝试将Frame设置为visible时出错:

package rules;

import java.sql.ResultSet;
import java.sql.SQLException;

import persistence.DatabaseQueries;
import view.mainWindow;

public class scheduledTask {

    private static ResultSet resultSetVar;


    public static Runnable updateActivitiesToRun = new Runnable() {
        public void run() {         

            System.out.println("first message");
            mainWindow.setFrameListOfActivities();

            DatabaseQueries.updateActivitiesToStartNotification(DatabaseQueries.databaseConnect());
        }
    };  
}

frameListOfActivities方法中的setFrameListOfActivities在调用时为null

发生这种情况是因为您已经在main方法中重新声明了它。

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                //...
                //My Second JFrame
                listActivities frameListOfActivities = new listActivities();
                // ^--- Redeclared as a local variable...
                frameListOfActivities.setVisible(false);

提防过分依赖static ,这是您的设计错误并且需要工作的一个很好的指示。 frameListOfActivities的实例传递给使用ScheduledExecutorService调度的Runnable实例。 我还要担心让此窗口每2秒可见一次...好像您不喜欢您的用户...

实际上,我想知道SwingWorker是否会是更好的解决方案...请记住,Swing不是线程安全的,永远不要从事件调度线程之外创建或修改UI的状态。

避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。 有太多因素会影响组件的单个大小,您无法控制。 Swing旨在与布局经理为核心一起工作,舍弃这些问题不会导致问题和问题的终结,您将花费越来越多的时间来进行纠正。 请参阅为什么在SWING中使用空布局会让人皱眉? 更多细节

还请注意使用多个框架,这可能会使用户难以管理(我有足够的打开的窗口),并且还会使用户感到困惑。 看看“使用多个JFrame,良好/不良实践”? 更多细节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM