Я пытаюсь открыть JPanel из другого кадра.Не в состоянии сделать это - PullRequest
1 голос
/ 26 сентября 2010

Я создаю программу для работы с базой данных с правильным графическим интерфейсом и все. Я использую качели для того же. В любом случае, когда я запускаю приложение, открывается следующее окно:

public class MusicShopManagementView extends FrameView {

public MusicShopManagementView(SingleFrameApplication app) {
    super(app);

    initComponents();

    // status bar initialization - message timeout, idle icon and busy animation, etc
    ResourceMap resourceMap = getResourceMap();
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
    messageTimer = new Timer(messageTimeout, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            statusMessageLabel.setText("");
        }
    });
    messageTimer.setRepeats(false);
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
    for (int i = 0; i < busyIcons.length; i++) {
        busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
    }
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
            statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
        }
    }); 
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);

    // connecting action tasks to status bar via TaskMonitor
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if ("started".equals(propertyName)) {
                if (!busyIconTimer.isRunning()) {
                    statusAnimationLabel.setIcon(busyIcons[0]);
                    busyIconIndex = 0;
                    busyIconTimer.start();
                }
                progressBar.setVisible(true);
                progressBar.setIndeterminate(true);
            } else if ("done".equals(propertyName)) {
                busyIconTimer.stop();
                statusAnimationLabel.setIcon(idleIcon);
                progressBar.setVisible(false);
                progressBar.setValue(0);
            } else if ("message".equals(propertyName)) {
                String text = (String)(evt.getNewValue());
                statusMessageLabel.setText((text == null) ? "" : text);
                messageTimer.restart();
            } else if ("progress".equals(propertyName)) {
                int value = (Integer)(evt.getNewValue());
                progressBar.setVisible(true);
                progressBar.setIndeterminate(false);
                progressBar.setValue(value);
            }
        }
    });

    // tracking table selection
    masterTable.getSelectionModel().addListSelectionListener(
        new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                firePropertyChange("recordSelected", !isRecordSelected(),
                    isRecordSelected());
            }
        });

    // tracking changes to save
    bindingGroup.addBindingListener(new AbstractBindingListener() {
        @Override
        public void targetChanged(Binding binding, PropertyStateEvent event) {
            // save action observes saveNeeded property
            setSaveNeeded(true);
        }
    });

    // have a transaction started
    entityManager.getTransaction().begin();
}


public boolean isSaveNeeded() {
    return saveNeeded;
}

private void setSaveNeeded(boolean saveNeeded) {
    if (saveNeeded != this.saveNeeded) {
        this.saveNeeded = saveNeeded;
        firePropertyChange("saveNeeded", !saveNeeded, saveNeeded);
    }
}

public boolean isRecordSelected() {
    return masterTable.getSelectedRow() != -1;
}


@Action
public void newRecord() {
    musicshopmanagement.Intrument i = new musicshopmanagement.Intrument();
    entityManager.persist(i);
    list.add(i);
    int row = list.size()-1;
    masterTable.setRowSelectionInterval(row, row);
    masterTable.scrollRectToVisible(masterTable.getCellRect(row, 0, true));
    setSaveNeeded(true);
}

@Action(enabledProperty = "recordSelected")
public void deleteRecord() {
    int[] selected = masterTable.getSelectedRows();
    List<musicshopmanagement.Intrument> toRemove = new
        ArrayList<musicshopmanagement.Intrument>(selected.length);
    for (int idx=0; idx<selected.length; idx++) {
        musicshopmanagement.Intrument i = 
            list.get(masterTable.convertRowIndexToModel(selected[idx]));
        toRemove.add(i);
        entityManager.remove(i);
    }
    list.removeAll(toRemove);
    setSaveNeeded(true);
}


@Action(enabledProperty = "saveNeeded")
public Task save() {
    return new SaveTask(getApplication());
}

private class SaveTask extends Task {
    SaveTask(org.jdesktop.application.Application app) {
        super(app);
    }
    @Override protected Void doInBackground() {
        try {
            entityManager.getTransaction().commit();
            entityManager.getTransaction().begin();
        } catch (RollbackException rex) {
            rex.printStackTrace();
            entityManager.getTransaction().begin();
            List<musicshopmanagement.Intrument> merged = new 
                ArrayList<musicshopmanagement.Intrument>(list.size());
            for (musicshopmanagement.Intrument i : list) {
                merged.add(entityManager.merge(i));
            }
            list.clear();
            list.addAll(merged);
        }
        return null;
    }
    @Override protected void finished() {
        setSaveNeeded(false);
    }
}

/**
 * An example action method showing how to create asynchronous tasks
 * (running on background) and how to show their progress. Note the
 * artificial 'Thread.sleep' calls making the task long enough to see the
 * progress visualization - remove the sleeps for real application.
 */
@Action
public Task refresh() {
   return new RefreshTask(getApplication());
}

private class RefreshTask extends Task {
    RefreshTask(org.jdesktop.application.Application app) {
        super(app);
    }
    @SuppressWarnings("unchecked")
    @Override protected Void doInBackground() {
        try {
            setProgress(0, 0, 4);
            setMessage("Rolling back the current changes...");
            setProgress(1, 0, 4);
            entityManager.getTransaction().rollback();

            setProgress(2, 0, 4);

            setMessage("Starting a new transaction...");
            entityManager.getTransaction().begin();

            setProgress(3, 0, 4);

            setMessage("Fetching new data...");
            java.util.Collection data = query.getResultList();
            for (Object entity : data) {
                entityManager.refresh(entity);
            }

            setProgress(4, 0, 4);


            list.clear();
            list.addAll(data);
        } catch(Exception ignore) { }
        return null;
    }
    @Override protected void finished() {
        setMessage("Done.");
        setSaveNeeded(false);
    }
}

@Action
public void showAboutBox() {
    if (aboutBox == null) {
        JFrame mainFrame = MusicShopManagementApp.getApplication().getMainFrame();
        aboutBox = new MusicShopManagementAboutBox(mainFrame);
        aboutBox.setLocationRelativeTo(mainFrame);
    }
    MusicShopManagementApp.getApplication().show(aboutBox);
}
@Action
public void showInventory() {
    JFrame frame1 = new JFrame(); 
            frame1.setContentPane(new InventoryForm());
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame1.setVisible(true);

}

Теперь я хочу открыть еще один JPanel с именем InventoryForm. Последний метод showInventory() в приведенном выше коде должен открыть InventoryForm, но я получаю ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.Error: java.lang.reflect.InvocationTargetException
    at org.jdesktop.application.ApplicationAction.actionFailed(ApplicationAction.java:859)
    at org.jdesktop.application.ApplicationAction.noProxyActionPerformed(ApplicationAction.java:665)
    at org.jdesktop.application.ApplicationAction.actionPerformed(ApplicationAction.java:698)
.................

Либо весь мой подход неверен, либо я (очевидно) что-то напортачил. Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

"проект в данный момент заморожен." "Проект в данный момент заморожен."

Это не совсем так. Вы можете просмотреть абсолютно совместимый форк этого фреймворка на http://kenai.com/projects/bsaf

Она собирается выпустить версию 1.9 с огромным количеством исправленных ошибок и несколькими важными улучшениями.

Если вам нужна помощь в решении вашей проблемы, вы можете воспользоваться форумом этого проекта. Там много опытных разработчиков. Укажите full трассировку стека и фрагмент кода, в котором вы выполняете действие для кнопки или элемента меню.

1 голос
/ 26 сентября 2010

Похоже, вы используете Swing Application Framework (JSR 296) , с которым я незнаком, но обычный подход заключается в add() панели на раме, как предлагается ниже.

http://platform.netbeans.org/ frame1 = new JFrame(); 
frame1.add(new InventoryForm());
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);

Вот общая альтернатива:

frame1.getContentPane().add(new InventoryForm());

Добавление: из диалогового окна NetBeans New Project: «Обратите внимание, что JSR-296 (платформа приложений Swing)больше не разрабатывается и не станет частью официального Java Development Kit, как было запланировано изначально. Вы по-прежнему можете использовать библиотеку Swing Application Framework как есть, но дальнейшая разработка не ожидается. "

" Если выищите основанную на Swing инфраструктуру приложений, рассмотрите возможность использования платформы NetBeans platform.netbeans.org, которая является полнофункциональной платформой, подходящей для создания сложных и масштабируемых настольных приложений. Платформа содержит API-интерфейсы, которые упрощают обработкуокна, действия, файлы и многие другие типичные элементы приложения. "

...