/* * Copyright (c) 2012 Patrick Meyer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.itemanalysis.jmetrik.stats.irt.linking; import com.itemanalysis.jmetrik.dao.DatabaseAccessObject; import com.itemanalysis.jmetrik.dao.DatabaseType; import com.itemanalysis.jmetrik.dao.DerbyDatabaseAccessObject; import com.itemanalysis.jmetrik.dao.JmetrikDatabaseFactory; import com.itemanalysis.jmetrik.gui.SelectTableDialog; import com.itemanalysis.jmetrik.model.SortedListModel; import com.itemanalysis.jmetrik.sql.DataTableName; import com.itemanalysis.jmetrik.sql.DatabaseName; import com.itemanalysis.jmetrik.workspace.JmetrikPreferencesManager; import com.itemanalysis.psychometrics.data.VariableAttributes; import com.itemanalysis.psychometrics.data.VariableName; import org.apache.log4j.Logger; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; public class IrtLinkingDialog extends JDialog { // Variables declaration - do not modify private JRadioButton biasedRadioButton; private JLabel binLabel; private JTextField binsTextField; private JButton cancelButton; private JRadioButton cgRadioButton; private JLabel convergeLabel; private JTextField convergeTextField; private ButtonGroup criterionButtonGroup; private JPanel criterionPanel; private ButtonGroup distributionButtonGroup; private JRadioButton formXCriterionRadioButton; private JButton formXItemButton; private JButton formXPersonButton; private JRadioButton formYCriterionRadioButton; private JButton formYItemButton; private JButton formYPersonButton; private JRadioButton haebaraRadioButton; private JRadioButton histogramRadioButton; private JPanel itemParameterPanel; private JCheckBox itemTransformCheckBox; // private JPanel equatingPanel; private JRadioButton bobyqaRadioButton; private JRadioButton logisticRadioButton; private JLabel maxLabel1; private JLabel maxLabel2; private JTextField maxTextField1; private JTextField maxTextField2; private JLabel meanLabel; private JTextField meanTextField; private JPanel methodPanel; private JLabel min1Label; private JLabel minLabel2; private JTextField minTextField1; private JTextField minTextField2; private JRadioButton mmRadioButton; private JRadioButton msRadioButton; private JLabel normalBinLabel; private JRadioButton normalDistributionRadioButton; private JRadioButton normalRadioButton; private JLabel noteLabel; private JRadioButton observedValuesRadioButton; private JButton okButton; private ButtonGroup optimizationGroup; private JPanel optimizationPanel; private JPanel parameterPanel; private JPanel personDistributionPanel; private JPanel personParameterPanel; private JCheckBox personTransformCheckBox; private JLabel pointLabel2; private JTextField pointsTextField1; private JTextField pointsTextField2; private JLabel precisionLabel; private JTextField precisionTextField; private JButton resetButton; private ButtonGroup scaleButtonGroup; private JPanel scalePanel; private ButtonGroup sdButtonGroup; private JLabel sdLabel; private JPanel sdPanel; private JTextField sdTextField; private JRadioButton slRadioButton; private JTabbedPane tabbedPane; private ButtonGroup transformButtonGroup; private JPanel transformPanel; private JPanel transformationPanel; private JRadioButton unbiasedRadioButton; private JRadioButton uniformRadioButton; private JRadioButton xyCriterionRadioButton; private JButton xyItemButton; // End of variables declaration private Connection conn = null; private DatabaseAccessObject dao = null; private boolean canRun = false; private IrtLinkingItemPairDialog itemPairDialog = null; private SelectTableDialog itemDialogX = null; private SelectTableDialog itemDialogY = null; private IrtLinkingThetaDialog thetaDialogX = null; private IrtLinkingThetaDialog thetaDialogY = null; private IrtLinkingCommand command = null; private DataTableName tableX = null; private DataTableName tableY = null; private DataTableName tableXtheta = null; private DataTableName tableYtheta = null; private static String FORMX = "Form X"; private static String FORMY = "Form Y"; // private boolean transformItems = false; // private boolean transformPersons = false; private DatabaseName dbName = null; private SortedListModel<DataTableName> tableListModel; static Logger logger = Logger.getLogger("jmetrik-logger"); public IrtLinkingDialog(JFrame parent, Connection conn, DatabaseName dbName, SortedListModel<DataTableName> tableListModel){ super(parent, "IRT Scale Linking", true); this.conn = conn; this.dbName = dbName; this.tableListModel = tableListModel; initComponents(); setResizable(false); setLocationRelativeTo(parent); //get type of database according to properties JmetrikPreferencesManager preferencesManager = new JmetrikPreferencesManager(); String dbType = preferencesManager.getDatabaseType(); JmetrikDatabaseFactory dbFactory; if(DatabaseType.APACHE_DERBY.toString().equals(dbType)){ dao = new DerbyDatabaseAccessObject(); dbFactory = new JmetrikDatabaseFactory(DatabaseType.APACHE_DERBY); }else if(DatabaseType.MYSQL.toString().equals(dbType)){ //not yet implemented }else{ //default is apache derby dao = new DerbyDatabaseAccessObject(); dbFactory = new JmetrikDatabaseFactory(DatabaseType.APACHE_DERBY); } //prevent running an analysis when window close button is clicked this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e){ canRun = false; } }); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { distributionButtonGroup = new ButtonGroup(); scaleButtonGroup = new ButtonGroup(); sdButtonGroup = new ButtonGroup(); transformButtonGroup = new ButtonGroup(); optimizationGroup = new ButtonGroup(); criterionButtonGroup = new ButtonGroup(); tabbedPane = new JTabbedPane(); parameterPanel = new JPanel(); itemParameterPanel = new JPanel(); formXItemButton = new JButton(); // formXItemButton.addActionListener(new ActionListener() { // @Override // public void actionPerformed(ActionEvent e) { // if(itemDialogX==null){ // itemDialogX = new IrtEquatingItemDialog(IrtEquatingDialog.this, conn, dao, tableListModel, FORMX); // } // itemDialogX.setVisible(true); // // if(itemDialogX.canRun()){ // tableX = itemDialogX.getTableName(); // } // } // }); formXItemButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(itemDialogX==null){ itemDialogX = new SelectTableDialog(IrtLinkingDialog.this, dbName, tableListModel); itemDialogX.setTitle("Form X Item Table"); } itemDialogX.setVisible(true); if(itemDialogX.canRun()){ tableX = itemDialogX.getSelectedTable(); } } }); formYItemButton = new JButton(); // formYItemButton.addActionListener(new ActionListener() { // @Override // public void actionPerformed(ActionEvent e) { // if(itemDialogY==null){ // itemDialogY = new IrtEquatingItemDialog(IrtEquatingDialog.this, conn, dao, tableListModel, FORMY); // } // itemDialogY.setVisible(true); // if(itemDialogY.canRun()){ // tableY = itemDialogY.getTableName(); // } // } // }); formYItemButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(itemDialogY==null){ itemDialogY = new SelectTableDialog(IrtLinkingDialog.this, dbName, tableListModel); itemDialogY.setTitle("Form Y Item Table"); } itemDialogY.setVisible(true); if(itemDialogY.canRun()){ tableY = itemDialogY.getSelectedTable(); } } }); xyItemButton = new JButton(); xyItemButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(itemDialogX!=null && itemDialogY!=null){ if(!itemDialogX.canRun() && !itemDialogY.canRun()){ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "You must select an item table for Form X and Form Y.", "Insufficient Item Data", JOptionPane.ERROR_MESSAGE); }else{ try{ //check to see if selected tables are item parameter tables isItemParameterTable(tableX); isItemParameterTable(tableY); //if table are item parameter tables, then start item pair dialog if(itemPairDialog==null){ itemPairDialog = new IrtLinkingItemPairDialog(IrtLinkingDialog.this, conn, tableX, tableY); } itemPairDialog.setVisible(true); if(itemPairDialog.canRun()){ //nothing here. Dialog is only building syntax. Not returning anything here. } }catch(SQLException ex){ logger.fatal(ex.getMessage(), ex); JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Selected table is probably not a table of item parameters.\n" + "Select another table.", "SQL Exception", JOptionPane.ERROR_MESSAGE); } }//end if } } }); personDistributionPanel = new JPanel(); observedValuesRadioButton = new JRadioButton(); observedValuesRadioButton.setActionCommand("observed"); observedValuesRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { formXPersonButton.setEnabled(true); formYPersonButton.setEnabled(true); binsTextField.setEnabled(false); pointsTextField2.setEnabled(false); minTextField2.setEnabled(false); maxTextField2.setEnabled(false); pointsTextField1.setEnabled(false); minTextField1.setEnabled(false); maxTextField1.setEnabled(false); meanTextField.setEnabled(false); sdTextField.setEnabled(false); } }); histogramRadioButton = new JRadioButton(); histogramRadioButton.setActionCommand("histogram"); histogramRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { formXPersonButton.setEnabled(true); formYPersonButton.setEnabled(true); binsTextField.setEnabled(true); pointsTextField2.setEnabled(false); minTextField2.setEnabled(false); maxTextField2.setEnabled(false); pointsTextField1.setEnabled(false); minTextField1.setEnabled(false); maxTextField1.setEnabled(false); meanTextField.setEnabled(false); sdTextField.setEnabled(false); } }); binLabel = new JLabel(); binsTextField = new JTextField(); normalDistributionRadioButton = new JRadioButton(); normalDistributionRadioButton.setActionCommand("normal"); normalDistributionRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { formXPersonButton.setEnabled(false); formYPersonButton.setEnabled(false); binsTextField.setEnabled(false); pointsTextField2.setEnabled(false); minTextField2.setEnabled(false); maxTextField2.setEnabled(false); pointsTextField1.setEnabled(true); minTextField1.setEnabled(true); maxTextField1.setEnabled(true); meanTextField.setEnabled(true); sdTextField.setEnabled(true); } }); meanLabel = new JLabel(); meanTextField = new JTextField(); min1Label = new JLabel(); minTextField1 = new JTextField(); maxLabel1 = new JLabel(); normalBinLabel = new JLabel(); pointsTextField1 = new JTextField(); uniformRadioButton = new JRadioButton(); uniformRadioButton.setActionCommand("uniform"); uniformRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { formXPersonButton.setEnabled(false); formYPersonButton.setEnabled(false); binsTextField.setEnabled(false); pointsTextField2.setEnabled(true); minTextField2.setEnabled(true); maxTextField2.setEnabled(true); pointsTextField1.setEnabled(false); minTextField1.setEnabled(false); maxTextField1.setEnabled(false); meanTextField.setEnabled(false); sdTextField.setEnabled(false); } }); pointLabel2 = new JLabel(); pointsTextField2 = new JTextField(); minLabel2 = new JLabel(); minTextField2 = new JTextField(); maxTextField1 = new JTextField(); sdLabel = new JLabel(); sdTextField = new JTextField(); maxLabel2 = new JLabel(); maxTextField2 = new JTextField(); //initial radio button settings for the personDistributionPanel binsTextField.setEnabled(false); pointsTextField2.setEnabled(true); minTextField2.setEnabled(true); maxTextField2.setEnabled(true); pointsTextField1.setEnabled(false); minTextField1.setEnabled(false); maxTextField1.setEnabled(false); meanTextField.setEnabled(false); sdTextField.setEnabled(false); //end initial radio button values scalePanel = new JPanel(); logisticRadioButton = new JRadioButton(); logisticRadioButton.setActionCommand("logistic"); scaleButtonGroup.add(logisticRadioButton); normalRadioButton = new JRadioButton(); normalRadioButton.setActionCommand("normal"); scaleButtonGroup.add(normalRadioButton); personParameterPanel = new JPanel(); formXPersonButton = new JButton(); formXPersonButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(thetaDialogX==null){ thetaDialogX = new IrtLinkingThetaDialog(IrtLinkingDialog.this, conn, dao, tableListModel, FORMX); } thetaDialogX.setVisible(true); } }); formXPersonButton.setEnabled(false); formYPersonButton = new JButton(); formYPersonButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(thetaDialogY==null){ thetaDialogY = new IrtLinkingThetaDialog(IrtLinkingDialog.this, conn, dao, tableListModel, FORMY); } thetaDialogY.setVisible(true); } }); formYPersonButton.setEnabled(false); transformationPanel = new JPanel(); methodPanel = new JPanel(); msRadioButton = new JRadioButton(); msRadioButton.setActionCommand("ms"); mmRadioButton = new JRadioButton(); mmRadioButton.setActionCommand("mm"); haebaraRadioButton = new JRadioButton(); haebaraRadioButton.setActionCommand("hb"); slRadioButton = new JRadioButton(); slRadioButton.setActionCommand("sl"); transformPanel = new JPanel(); itemTransformCheckBox = new JCheckBox(); itemTransformCheckBox.setActionCommand("items"); personTransformCheckBox = new JCheckBox(); personTransformCheckBox.setActionCommand("persons"); precisionLabel = new JLabel(); precisionTextField = new JTextField(); optimizationPanel = new JPanel(); cgRadioButton = new JRadioButton(); cgRadioButton.setActionCommand("cg"); bobyqaRadioButton = new JRadioButton(); bobyqaRadioButton.setActionCommand("lbfgs"); convergeLabel = new JLabel(); convergeTextField = new JTextField(); criterionPanel = new JPanel(); formXCriterionRadioButton = new JRadioButton(); formXCriterionRadioButton.setActionCommand("x"); formYCriterionRadioButton = new JRadioButton(); formYCriterionRadioButton.setActionCommand("y"); xyCriterionRadioButton = new JRadioButton(); xyCriterionRadioButton.setActionCommand("xy"); sdPanel = new JPanel(); biasedRadioButton = new JRadioButton(); biasedRadioButton.setActionCommand("biased"); unbiasedRadioButton = new JRadioButton(); unbiasedRadioButton.setActionCommand("unbiased"); noteLabel = new JLabel(); // equatingPanel = new JPanel(); okButton = new JButton(); okButton.setText("Run"); okButton.addActionListener(new OkActionListener()); okButton.setMaximumSize(new Dimension(69, 28)); okButton.setMinimumSize(new Dimension(69, 28)); okButton.setPreferredSize(new Dimension(69, 28)); cancelButton = new JButton(); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { canRun=false; setVisible(false); } }); cancelButton.setText("Cancel"); cancelButton.setMaximumSize(new Dimension(69, 28)); cancelButton.setMinimumSize(new Dimension(69, 28)); cancelButton.setPreferredSize(new Dimension(69, 28)); resetButton = new JButton(); resetButton.setText("Reset"); resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { resetDialogs(); } }); resetButton.setMaximumSize(new Dimension(69, 28)); resetButton.setMinimumSize(new Dimension(69, 28)); resetButton.setPreferredSize(new Dimension(69, 28)); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); parameterPanel.setPreferredSize(new Dimension(445, 550)); itemParameterPanel.setBorder(BorderFactory.createTitledBorder("Item Parameters")); itemParameterPanel.setPreferredSize(new Dimension(436, 171)); formXItemButton.setText("Select Form X"); formYItemButton.setText("Select Form Y"); xyItemButton.setText("Select XY Pairs"); GroupLayout itemParameterPanelLayout = new GroupLayout(itemParameterPanel); itemParameterPanel.setLayout(itemParameterPanelLayout); itemParameterPanelLayout.setHorizontalGroup( itemParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(itemParameterPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(itemParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) .addComponent(formXItemButton, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(formYItemButton, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(xyItemButton, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 128, GroupLayout.PREFERRED_SIZE)) .addContainerGap(24, Short.MAX_VALUE)) ); itemParameterPanelLayout.setVerticalGroup( itemParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(itemParameterPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(formXItemButton) .addGap(5, 5, 5) .addComponent(formYItemButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(xyItemButton) .addContainerGap(35, Short.MAX_VALUE)) ); personDistributionPanel.setBorder(BorderFactory.createTitledBorder("Person Distribution")); distributionButtonGroup.add(observedValuesRadioButton); observedValuesRadioButton.setText("Points and weights"); distributionButtonGroup.add(histogramRadioButton); histogramRadioButton.setText("Histogram"); binLabel.setText("Bins"); binsTextField.setText(""); distributionButtonGroup.add(normalDistributionRadioButton); normalDistributionRadioButton.setText("Normal"); meanLabel.setText("Mean"); meanTextField.setText("0"); min1Label.setText("Min"); minTextField1.setText("-4"); maxLabel1.setText("Max"); normalBinLabel.setText("Points"); pointsTextField1.setText("25"); distributionButtonGroup.add(uniformRadioButton); uniformRadioButton.setSelected(true); uniformRadioButton.setText("Uniform"); pointLabel2.setText("Points"); pointsTextField2.setText("25"); minLabel2.setText("Min"); minTextField2.setText("-4"); maxTextField1.setText("4"); sdLabel.setText("SD"); sdTextField.setText("1"); maxLabel2.setText("Max"); maxTextField2.setText("4"); GroupLayout personDistributionPanelLayout = new GroupLayout(personDistributionPanel); personDistributionPanel.setLayout(personDistributionPanelLayout); personDistributionPanelLayout.setHorizontalGroup( personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(observedValuesRadioButton) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(GroupLayout.Alignment.LEADING, personDistributionPanelLayout.createSequentialGroup() .addComponent(normalDistributionRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE) .addComponent(normalBinLabel)) .addGroup(GroupLayout.Alignment.LEADING, personDistributionPanelLayout.createSequentialGroup() .addComponent(uniformRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 31, Short.MAX_VALUE) .addComponent(pointLabel2)) .addGroup(GroupLayout.Alignment.LEADING, personDistributionPanelLayout.createSequentialGroup() .addComponent(histogramRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 31, Short.MAX_VALUE) .addComponent(binLabel))) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(pointsTextField2) .addComponent(binsTextField, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 47, Short.MAX_VALUE) .addComponent(pointsTextField1, GroupLayout.Alignment.TRAILING)) .addGap(25, 25, 25) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(meanLabel) .addComponent(minLabel2))) .addComponent(min1Label)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(minTextField2) .addComponent(meanTextField) .addComponent(minTextField1, GroupLayout.DEFAULT_SIZE, 49, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 14, Short.MAX_VALUE) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addGap(12, 12, 12) .addComponent(maxLabel1) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(maxTextField1, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE)) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addComponent(sdLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(sdTextField, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE)) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addComponent(maxLabel2) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(maxTextField2, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE))) .addGap(2, 2, 2))) .addGap(63, 63, 63)) ); personDistributionPanelLayout.setVerticalGroup( personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(personDistributionPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(observedValuesRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(histogramRadioButton) .addComponent(binsTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(binLabel)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(uniformRadioButton) .addComponent(pointLabel2) .addComponent(pointsTextField2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(minLabel2) .addComponent(minTextField2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(maxLabel2) .addComponent(maxTextField2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(normalDistributionRadioButton) .addComponent(normalBinLabel) .addComponent(pointsTextField1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(meanLabel) .addComponent(meanTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(sdLabel) .addComponent(sdTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(personDistributionPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(minTextField1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(min1Label) .addComponent(maxLabel1) .addComponent(maxTextField1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); scalePanel.setBorder(BorderFactory.createTitledBorder("Default Scale")); logisticRadioButton.setSelected(true); logisticRadioButton.setText("Logistic (D = 1.0)"); normalRadioButton.setText("Normal (D = 1.7)"); GroupLayout scalePanelLayout = new GroupLayout(scalePanel); scalePanel.setLayout(scalePanelLayout); scalePanelLayout.setHorizontalGroup( scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(scalePanelLayout.createSequentialGroup() .addContainerGap() .addGroup(scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(logisticRadioButton) .addComponent(normalRadioButton)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); scalePanelLayout.setVerticalGroup( scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(scalePanelLayout.createSequentialGroup() .addContainerGap() .addComponent(logisticRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(normalRadioButton) .addContainerGap(70, Short.MAX_VALUE)) ); // scalePanel.setBorder(BorderFactory.createTitledBorder("Model Details")); // // logisticRadioButton.setSelected(true); // logisticRadioButton.setText("Logistic (D = 1.0)"); // normalRadioButton.setText("Normal (D = 1.7)"); // // modelDetailButton = new JButton(); // modelDetailButton.setText("Select IRM"); // // GroupLayout scalePanelLayout = new GroupLayout(scalePanel); // scalePanel.setLayout(scalePanelLayout); // scalePanelLayout.setHorizontalGroup( // scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) // .addGroup(scalePanelLayout.createSequentialGroup() // .addContainerGap() // .addGroup(scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) // .addComponent(logisticRadioButton) // .addComponent(normalRadioButton) // .addComponent(modelDetailButton)) // .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) // ); // scalePanelLayout.setVerticalGroup( // scalePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) // .addGroup(scalePanelLayout.createSequentialGroup() // .addContainerGap() // .addComponent(modelDetailButton) // .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) // .addComponent(logisticRadioButton) // .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) // .addComponent(normalRadioButton) // .addContainerGap(36, Short.MAX_VALUE)) // ); personParameterPanel.setBorder(BorderFactory.createTitledBorder("Person Parameters")); formXPersonButton.setText("Select Form X"); formYPersonButton.setText("Select Form Y"); GroupLayout personParameterPanelLayout = new GroupLayout(personParameterPanel); personParameterPanel.setLayout(personParameterPanelLayout); personParameterPanelLayout.setHorizontalGroup( personParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(personParameterPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(personParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(formXPersonButton) .addComponent(formYPersonButton)) .addContainerGap(20, Short.MAX_VALUE)) ); personParameterPanelLayout.setVerticalGroup( personParameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(personParameterPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(formXPersonButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(formYPersonButton) .addContainerGap(63, Short.MAX_VALUE)) ); GroupLayout parameterPanelLayout = new GroupLayout(parameterPanel); parameterPanel.setLayout(parameterPanelLayout); parameterPanelLayout.setHorizontalGroup( parameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, parameterPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(personDistributionPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(parameterPanelLayout.createSequentialGroup() .addComponent(itemParameterPanel, GroupLayout.PREFERRED_SIZE, 174, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(personParameterPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(scalePanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGap(76, 76, 76)) ); parameterPanelLayout.setVerticalGroup( parameterPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(parameterPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(personParameterPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(scalePanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(itemParameterPanel, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 153, GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(personDistributionPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addGap(47, 47, 47)) ); tabbedPane.addTab("Parameters", parameterPanel); methodPanel.setBorder(BorderFactory.createTitledBorder("Method")); transformButtonGroup.add(msRadioButton); msRadioButton.setText("Mean/Sigma"); transformButtonGroup.add(mmRadioButton); mmRadioButton.setText("Mean/Mean"); transformButtonGroup.add(haebaraRadioButton); haebaraRadioButton.setText("Haebara"); transformButtonGroup.add(slRadioButton); slRadioButton.setSelected(true); slRadioButton.setText("Stocking-Lord"); GroupLayout methodPanelLayout = new GroupLayout(methodPanel); methodPanel.setLayout(methodPanelLayout); methodPanelLayout.setHorizontalGroup( methodPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(methodPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(methodPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(msRadioButton) .addComponent(mmRadioButton) .addComponent(haebaraRadioButton) .addComponent(slRadioButton)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); methodPanelLayout.setVerticalGroup( methodPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(methodPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(msRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(mmRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(haebaraRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(slRadioButton) .addContainerGap(16, Short.MAX_VALUE)) ); transformPanel.setBorder(BorderFactory.createTitledBorder("Transform")); itemTransformCheckBox.setText("Item parameters"); personTransformCheckBox.setText("Person parameters"); precisionLabel.setText("Precision"); precisionTextField.setText("2"); GroupLayout transformPanelLayout = new GroupLayout(transformPanel); transformPanel.setLayout(transformPanelLayout); transformPanelLayout.setHorizontalGroup( transformPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(transformPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(itemTransformCheckBox) .addComponent(personTransformCheckBox) .addGroup(transformPanelLayout.createSequentialGroup() .addComponent(precisionLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(precisionTextField))) .addContainerGap(13, Short.MAX_VALUE)) ); transformPanelLayout.setVerticalGroup( transformPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(itemTransformCheckBox) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(personTransformCheckBox) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(transformPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(precisionTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(precisionLabel)) .addContainerGap(41, Short.MAX_VALUE)) ); optimizationPanel.setBorder(BorderFactory.createTitledBorder("Optimization")); optimizationGroup.add(cgRadioButton); cgRadioButton.setText("Conjugate gradient"); cgRadioButton.setActionCommand("cg"); optimizationGroup.add(bobyqaRadioButton); bobyqaRadioButton.setText("Powell's BOBYQA"); bobyqaRadioButton.setActionCommand("bobyqa"); bobyqaRadioButton.setSelected(true); convergeLabel.setText("Converge"); convergeTextField.setText("0.0005"); GroupLayout optimizationPanelLayout = new GroupLayout(optimizationPanel); optimizationPanel.setLayout(optimizationPanelLayout); optimizationPanelLayout.setHorizontalGroup( optimizationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(optimizationPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(optimizationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(bobyqaRadioButton) .addComponent(cgRadioButton) .addGroup(optimizationPanelLayout.createSequentialGroup() .addComponent(convergeLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(convergeTextField, GroupLayout.DEFAULT_SIZE, 68, Short.MAX_VALUE))) .addContainerGap()) ); optimizationPanelLayout.setVerticalGroup( optimizationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(optimizationPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(cgRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(bobyqaRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(optimizationPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(convergeLabel) .addComponent(convergeTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(41, Short.MAX_VALUE)) ); criterionPanel.setBorder(BorderFactory.createTitledBorder("Criterion Function Distribution")); criterionButtonGroup.add(formXCriterionRadioButton); formXCriterionRadioButton.setText("Form X (Forward)"); criterionButtonGroup.add(formYCriterionRadioButton); formYCriterionRadioButton.setText("Form Y (Backward)"); criterionButtonGroup.add(xyCriterionRadioButton); xyCriterionRadioButton.setSelected(true); xyCriterionRadioButton.setText("Form X & Y (Symmetric)"); GroupLayout criterionPanelLayout = new GroupLayout(criterionPanel); criterionPanel.setLayout(criterionPanelLayout); criterionPanelLayout.setHorizontalGroup( criterionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(criterionPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(criterionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(formXCriterionRadioButton) .addComponent(formYCriterionRadioButton) .addComponent(xyCriterionRadioButton)) .addContainerGap(118, Short.MAX_VALUE)) ); criterionPanelLayout.setVerticalGroup( criterionPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(criterionPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(formXCriterionRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(formYCriterionRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(xyCriterionRadioButton) .addContainerGap(18, Short.MAX_VALUE)) ); sdPanel.setBorder(BorderFactory.createTitledBorder("Standard Deviation")); sdButtonGroup.add(biasedRadioButton); biasedRadioButton.setSelected(true); biasedRadioButton.setText("Biased (N)"); sdButtonGroup.add(unbiasedRadioButton); unbiasedRadioButton.setText("Unbiased (N-1)"); GroupLayout sdPanelLayout = new GroupLayout(sdPanel); sdPanel.setLayout(sdPanelLayout); sdPanelLayout.setHorizontalGroup( sdPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(sdPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(sdPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(biasedRadioButton) .addComponent(unbiasedRadioButton)) .addContainerGap(36, Short.MAX_VALUE)) ); sdPanelLayout.setVerticalGroup( sdPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(sdPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(biasedRadioButton) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(unbiasedRadioButton) .addContainerGap(44, Short.MAX_VALUE)) ); noteLabel.setText("Note: Form X (new form) is transformed to the scale of Form Y (old form)."); GroupLayout transformationPanelLayout = new GroupLayout(transformationPanel); transformationPanel.setLayout(transformationPanelLayout); transformationPanelLayout.setHorizontalGroup( transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformationPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformationPanelLayout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(noteLabel) .addContainerGap()) .addGroup(transformationPanelLayout.createSequentialGroup() .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) .addComponent(criterionPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(GroupLayout.Alignment.LEADING, transformationPanelLayout.createSequentialGroup() .addComponent(methodPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(transformPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(sdPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(optimizationPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(87, Short.MAX_VALUE)))) ); transformationPanelLayout.setVerticalGroup( transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformationPanelLayout.createSequentialGroup() .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) .addComponent(optimizationPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(transformPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(methodPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(12, 12, 12) .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) .addComponent(sdPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(criterionPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(noteLabel) .addGap(76, 76, 76)) ); tabbedPane.addTab("Transformation", transformationPanel); // GroupLayout jPanel1Layout = new GroupLayout(equatingPanel); // equatingPanel.setLayout(jPanel1Layout); // jPanel1Layout.setHorizontalGroup( // jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING) // .addGap(0, 527, Short.MAX_VALUE) // ); // jPanel1Layout.setVerticalGroup( // jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING) // .addGap(0, 402, Short.MAX_VALUE) // ); // // tabbedPane.addTab("Equating", equatingPanel); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(171, 171, 171) .addComponent(okButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(resetButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tabbedPane, GroupLayout.PREFERRED_SIZE, 532, GroupLayout.PREFERRED_SIZE))) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(tabbedPane, GroupLayout.PREFERRED_SIZE, 430, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(resetButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(okButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGap(16, 16, 16)) ); layout.linkSize(SwingConstants.VERTICAL, new Component[] {cancelButton, okButton, resetButton}); pack(); }// </editor-fold> // private void cancelButtonActionPerformed(ActionEvent evt) { // canRun=false; // setVisible(false); // } // private void itemBoxActionPerformed(ActionEvent evt) { // if(itemBox.isSelected()) transformItems=true; // else transformItems=false; // } // private void personBoxActionPerformed(ActionEvent evt) { // if(personTransformCheckBox.isSelected()) transformPersons=true; // else transformPersons=false; // } public void isItemParameterTable(DataTableName tableName)throws SQLException{ VariableName nameColumn = new VariableName("name"); ArrayList<VariableAttributes> tempVar = dao.getVariableAttributesFromColumn(conn, tableName, nameColumn); } public boolean canRun(){ return canRun; } public IrtLinkingCommand getCommand(){ return command; } public void resetDialogs(){ if(itemPairDialog!=null){ itemPairDialog.dispose(); itemPairDialog=null; } if(itemDialogX!=null){ itemDialogX.dispose(); itemDialogX=null; } if(itemDialogY!=null){ itemDialogY.dispose(); itemDialogY=null; } if(thetaDialogX!=null){ thetaDialogX.dispose(); thetaDialogX=null; } if(thetaDialogY!=null){ thetaDialogY.dispose(); thetaDialogY=null; } uniformRadioButton.setSelected(true); logisticRadioButton.setSelected(true); slRadioButton.setSelected(true); xyCriterionRadioButton.setSelected(true); itemTransformCheckBox.setSelected(false); personTransformCheckBox.setSelected(false); biasedRadioButton.setSelected(true); precisionTextField.setText("2"); convergeTextField.setText("0.0005"); binsTextField.setText(""); binsTextField.setEnabled(false); formXPersonButton.setEnabled(false); formYPersonButton.setEnabled(false); bobyqaRadioButton.setSelected(true); //uniform distribution pointsTextField2.setEnabled(true); pointsTextField2.setText("25"); minTextField2.setEnabled(true); minTextField2.setText("-4"); maxTextField2.setEnabled(true); maxTextField2.setText("4"); //normal distribution pointsTextField1.setEnabled(false); pointsTextField1.setText("25"); minTextField1.setEnabled(false); minTextField1.setText("-4"); maxTextField1.setEnabled(false); maxTextField1.setText("4"); sdTextField.setEnabled(false); sdTextField.setText("1"); meanTextField.setEnabled(false); meanTextField.setText("0"); cgRadioButton.setSelected(false); } public class OkActionListener implements ActionListener { public void actionPerformed(ActionEvent evt){ try{ command = new IrtLinkingCommand(); boolean hasItem = false; boolean hasItemPair = false; boolean hasItemX = false; boolean hasItemY = false; boolean hasThetaX = false; boolean hasThetaY = false; boolean hasObserved = false; boolean hasUniform = false; boolean hasNormal = false; boolean hasDistribution = false; boolean hasBins = false; if(itemDialogX!=null && itemDialogX.canRun()){ command.getPairedOptionList("xitem").addValue("db", dbName.toString()); command.getPairedOptionList("xitem").addValue("table", tableX.toString()); hasItemX = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Be sure you have selected Form X item parameters.", "Error", JOptionPane.ERROR_MESSAGE); } if(itemDialogY!=null && itemDialogY.canRun()){ command.getPairedOptionList("yitem").addValue("db", dbName.toString()); command.getPairedOptionList("yitem").addValue("table", tableY.toString()); hasItemY = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Be sure you have selected Form Y item parameters.", "Error", JOptionPane.ERROR_MESSAGE); } hasItem = (hasItemX && hasItemY); String distributionAction = distributionButtonGroup.getSelection().getActionCommand(); command.getSelectOneOption("distribution").setSelected(distributionAction); if(distributionAction.equals("observed") || distributionAction.equals("histogram")){ if(thetaDialogX!=null && thetaDialogX.canRun()){ tableXtheta = thetaDialogX.getTableName(); command.getPairedOptionList("xability").addValue("db", dbName.toString()); command.getPairedOptionList("xability").addValue("table", tableXtheta.toString()); command.getPairedOptionList("xability").addValue("theta", thetaDialogX.getTheta().getName().toString()); if(thetaDialogX.hasWeight()){ command.getPairedOptionList("xability").addValue("weight", thetaDialogX.getWeight().getName().toString()); }else{ command.getPairedOptionList("xability").addValue("weight", ""); } hasThetaX = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Be sure you have selected a Form X person parameter.", "Error", JOptionPane.ERROR_MESSAGE); } if(thetaDialogY!=null && thetaDialogY.canRun()){ tableYtheta = thetaDialogY.getTableName(); command.getPairedOptionList("yability").addValue("db", dbName.toString()); command.getPairedOptionList("yability").addValue("table", tableYtheta.toString()); command.getPairedOptionList("yability").addValue("theta", thetaDialogY.getTheta().getName().toString()); if(thetaDialogY.hasWeight()){ command.getPairedOptionList("yability").addValue("weight", thetaDialogY.getWeight().getName().toString()); }else{ command.getPairedOptionList("yability").addValue("weight", ""); } hasThetaY = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Be sure you have selected a Form Y person parameter.", "Error", JOptionPane.ERROR_MESSAGE); } hasObserved = (hasThetaX && hasThetaY); if(distributionAction.equals("histogram")){ if(binsTextField.getText().trim().equals("")){ command.getSelectOneOption("binmethod").setSelected("sturges"); }else{ int bins = Math.abs(Integer.parseInt(binsTextField.getText().trim())); command.getFreeOption("bins").add(bins); } hasBins = true; }else if(distributionAction.equals("observed")){ command.getSelectOneOption("binmethod").setSelected("all"); hasBins = true; } }else if(distributionAction.equals("uniform")){ int min = Integer.parseInt(minTextField2.getText().trim()); int max = Integer.parseInt(maxTextField2.getText().trim()); int numPoints = Integer.parseInt(pointsTextField2.getText().trim()); command.getPairedOptionList("uniform").addValue("min", min); command.getPairedOptionList("uniform").addValue("max", max); command.getPairedOptionList("uniform").addValue("bins", numPoints); hasUniform = true; }else{ //normal distribution double mean = Double.parseDouble(meanTextField.getText().trim()); double sd = Double.parseDouble(sdTextField.getText().trim()); int numPoints = Integer.parseInt(pointsTextField1.getText().trim()); double min = Double.parseDouble(minTextField1.getText().trim()); double max = Double.parseDouble(maxTextField1.getText().trim()); command.getPairedOptionList("normal").addValue("mean", mean); command.getPairedOptionList("normal").addValue("sd", sd); command.getPairedOptionList("normal").addValue("bins", numPoints); command.getPairedOptionList("normal").addValue("min", min); command.getPairedOptionList("normal").addValue("max", max); hasNormal = true; } hasDistribution = ((hasObserved && hasBins) || hasUniform || hasNormal); if(itemPairDialog!=null && itemPairDialog.canRun()){ Object[] obj = itemPairDialog.getSelectedPairs(); for(int i=0;i<obj.length;i++){ String xyp = ((LinkingItemPair)obj[i]).commandString(); command.getFreeOptionList("xypairs").addValue(xyp); } hasItemPair = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialog.this, "Be sure you have selected Form X and Form Y item pairs.", "Error", JOptionPane.ERROR_MESSAGE); } int precision = 4; if(!precisionTextField.getText().trim().equals("")){ precision = Integer.parseInt(precisionTextField.getText().trim()); } command.getSelectOneOption("popsd").setSelected(sdButtonGroup.getSelection().getActionCommand()); command.getSelectOneOption("scale").setSelected(scaleButtonGroup.getSelection().getActionCommand()); command.getSelectOneOption("criterion").setSelected(criterionButtonGroup.getSelection().getActionCommand()); command.getSelectOneOption("method").setSelected(transformButtonGroup.getSelection().getActionCommand()); if(personTransformCheckBox.isSelected()){ command.getSelectAllOption("transform").setSelected("persons", true); }else{ command.getSelectAllOption("transform").setSelected("persons", false); } if(itemTransformCheckBox.isSelected()){ command.getSelectAllOption("transform").setSelected("items", true); }else{ command.getSelectAllOption("transform").setSelected("items", false); } command.getFreeOption("precision").add(precision); canRun = (hasItem && hasItemPair && hasDistribution); if(canRun){ setVisible(false); } }catch(IllegalArgumentException ex){ logger.fatal(ex.getMessage(), ex); JOptionPane.showMessageDialog(IrtLinkingDialog.this, ex.getMessage(), "Syntax Error", JOptionPane.ERROR_MESSAGE); } } } }