/* * QualityControlPanel.java * * Created on Apr 20, 2010, 9:43:06 AM */ package org.autoplot.pngwalk; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractButton; import javax.swing.JFrame; import javax.swing.JRadioButton; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import org.das2.util.filesystem.FileObject; import org.das2.util.filesystem.FileSystem; import org.das2.util.filesystem.KeyChain; import org.das2.util.filesystem.WriteCapability; import org.das2.util.monitor.CancelledOperationException; import org.autoplot.datasource.DataSetURI; import org.das2.util.LoggerManager; /** * Panel and the facility for adding annotations to images. * @author Ed Jackson */ public class QualityControlPanel extends javax.swing.JPanel { private final JRadioButton nullRadioButton; private transient QualityControlRecord qcRecord; public static final String KEY_QUALITY_CONTROL_URI = "QualityControlURI"; private static final Logger logger= org.das2.util.LoggerManager.getLogger("autoplot.pngwalk"); private final PngWalkTool tool; /** Creates new form QualityControlPanel * @param tool the PngWalkTool using this panel. */ public QualityControlPanel( PngWalkTool tool ) { initComponents(); this.tool= tool; // Since we're supporting JRE 1.5, we can't use ButtonGroup.clearSelection() // 1.5 and earlier don't allow you to clear a button group, so we hack it with an invisible button nullRadioButton = new JRadioButton(); statusButtonGroup.add(nullRadioButton); //add to button group, but not to UI ItemListener l= new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if ( okRadioButton.isSelected() || problemRadioButton.isSelected() || ignoreRadioButton.isSelected() ) { saveButton.setEnabled(true); } else { saveButton.setEnabled(false); } } }; nullRadioButton.addItemListener(l); okRadioButton.addItemListener(l); problemRadioButton.addItemListener(l); ignoreRadioButton.addItemListener(l); statusButtonGroup.setSelected(nullRadioButton.getModel(), true); previousCommentEditorPane.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if ( e.getEventType()==HyperlinkEvent.EventType.ACTIVATED ) { String t= qcRecord.doCopyLink(e); newCommentTextArea.insert( t, newCommentTextArea.getCaretPosition() ); } } }); } transient PropertyChangeListener pc= new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ( evt.getPropertyName().equals( WalkImageSequence.PROP_BADGE_CHANGE ) ) { int i= (Integer) evt.getNewValue(); if ( i==walkImageSequence.getIndex() ) { QualityControlSequence qcs= walkImageSequence.getQualityControlSequence(); if ( qcs!=null ) { displayRecord( qcs.getQualityControlRecord(i) ); } } } } }; /** Load the contents of the provided record into the UI. Future UI changes * will affect the new record rather than any that was displayed before. * @param rec */ public void displayRecord(QualityControlRecord rec) { if ( rec==null ) { previousCommentEditorPane.setText(""); newCommentTextArea.setText(""); statusButtonGroup.setSelected(okRadioButton.getModel(), false); setStatus( 0,0,0,0 ); qcRecord= null; return; } previousCommentEditorPane.setText(rec.getCommentsHTML()); newCommentTextArea.setText(rec.getNewCommentText()); switch(rec.getStatus()) { case OK: statusButtonGroup.setSelected(okRadioButton.getModel(), true); break; case PROBLEM: statusButtonGroup.setSelected(problemRadioButton.getModel(), true); break; case IGNORE: statusButtonGroup.setSelected(ignoreRadioButton.getModel(), true); break; default: //catches Status.UNKNOWN statusButtonGroup.setSelected(nullRadioButton.getModel(), true); break; } QualityControlSequence seq= walkImageSequence.getQualityControlSequence(); int[] t= seq.getQCTotals(); qcRecord = rec; setStatus( t[0], t[1], t[2], t[3] ); } /** * set the status label showing number of okay, problem, etc. * @param numOK * @param numProblem * @param numIgnore * @param numUnknown */ protected void setStatus(int numOK, int numProblem, int numIgnore, int numUnknown) { String statustxt; if ( walkImageSequence==null || walkImageSequence.getQCFolder()==null ) { statustxt= " "; } else { int index= walkImageSequence.getIndex(); statustxt= String.format("#%d of %d OK | %d Prob | %d Ign | %d Unknown", (index+1), numOK, numProblem, numIgnore, numUnknown); } statusLabel.setText(statustxt); statusLabel.setToolTipText(statustxt); } /** * read sequence.properties and initialize. */ private void initQualitySequeuce() { { InputStream in = null; try { Properties sequenceProperties; sequenceProperties = new Properties(); String path; if ( tool==null ) { String template= walkImageSequence.getTemplate(); int i= WalkUtil.splitIndex(template); path= template.substring(0,i); } else { path= tool.getQCTUrl(); if ( path==null ) { String template= walkImageSequence.getTemplate(); int i= WalkUtil.splitIndex(template); path= template.substring(0,i); } } URI fsRoot = DataSetURI.getResourceURI(path); FileSystem tfs = FileSystem.create(fsRoot); FileObject propsFile = tfs.getFileObject("sequence.properties"); if (propsFile.exists()) { in = propsFile.getInputStream(); sequenceProperties.load(in); in.close(); } walkImageSequence.setQCFolder( DataSetURI.getResourceURI(sequenceProperties.getProperty(KEY_QUALITY_CONTROL_URI, path)) ); QualityControlSequence qseq= walkImageSequence.getQualityControlSequence(); int index= walkImageSequence.getIndex(); // DANGER: see repeat code if ( qseq==null || qseq.getQualityControlRecord(index)!=null ) { saveButton.setEnabled(true); setStateButtonedEnabled(true); } else { saveButton.setEnabled(false); setStateButtonedEnabled(false); } setStateButtonedEnabled(false); loginButton.setEnabled(true); } catch (FileNotFoundException ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } catch (IOException ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } finally { try { if ( in!=null ) in.close(); } catch (IOException ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } } } } private void login() { if ( walkImageSequence.getQualityControlSequence()==null ) { URI uri= walkImageSequence.getQCFolder(); try { URI uris = KeyChain.getDefault().resolveUserInfo(uri); walkImageSequence.initQualitySequence(uris); try { FileSystem fs= FileSystem.create(uri); WriteCapability w= fs.getFileObject("testwrite.txt").getCapability(WriteCapability.class); if ( w!=null && w.canWrite() ) { setStateButtonedEnabled(true); saveButton.setEnabled(true); loginButton.setEnabled(false); } else { //JOptionPane.showMessageDialog( QualityControlPanel.this,"Unable to write to File System
"+fs.getRootURI() ); loginButton.setEnabled(false); loginButton.setToolTipText("Unable to write to File System
"+fs.getRootURI()); saveButton.setEnabled(false); sequencePropertiesHost.setText( uri.toString() + " -- " + "Unable to write to file system" ); } } catch ( FileSystem.FileSystemOfflineException | UnknownHostException | FileNotFoundException ex) { Logger.getLogger(QualityControlPanel.class.getName()).log(Level.SEVERE, null, ex); } } catch (CancelledOperationException ex) { return; } } } /* This is temporary for testing */ public void setPreviousCommentText(String txt) { String htxt = "" + txt + "
"; previousCommentEditorPane.setText(htxt); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { bindingGroup = new org.jdesktop.beansbinding.BindingGroup(); statusButtonGroup = new javax.swing.ButtonGroup(); jLabel2 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); okRadioButton = new javax.swing.JRadioButton(); problemRadioButton = new javax.swing.JRadioButton(); ignoreRadioButton = new javax.swing.JRadioButton(); saveButton = new javax.swing.JButton(); loginButton = new javax.swing.JButton(); sequencePropertiesHost = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); commentSplitPane = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); previousCommentEditorPane = new javax.swing.JEditorPane(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); newCommentTextArea = new javax.swing.JTextArea(); jPanel3 = new javax.swing.JPanel(); statusLabel = new javax.swing.JLabel(); jLabel2.setText("jLabel2"); jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); statusButtonGroup.add(okRadioButton); okRadioButton.setSelected(true); okRadioButton.setText("OK"); okRadioButton.setToolTipText("Submit for further processing"); okRadioButton.setEnabled(false); okRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okRadioButtonActionPerformed(evt); } }); statusButtonGroup.add(problemRadioButton); problemRadioButton.setText("Problem"); problemRadioButton.setToolTipText("Send back for reprocessing"); problemRadioButton.setEnabled(false); problemRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { problemRadioButtonActionPerformed(evt); } }); statusButtonGroup.add(ignoreRadioButton); ignoreRadioButton.setText("Ignore"); ignoreRadioButton.setToolTipText("Do nothing further"); ignoreRadioButton.setEnabled(false); ignoreRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ignoreRadioButtonActionPerformed(evt); } }); saveButton.setText("Save"); saveButton.setToolTipText("Save the record to disk"); saveButton.setEnabled(false); saveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveButtonActionPerformed(evt); } }); loginButton.setText("Log In..."); loginButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { loginButtonActionPerformed(evt); } }); sequencePropertiesHost.setEditable(false); sequencePropertiesHost.setFont(sequencePropertiesHost.getFont().deriveFont((sequencePropertiesHost.getFont().getStyle() | java.awt.Font.ITALIC), sequencePropertiesHost.getFont().getSize()-2)); sequencePropertiesHost.setText("reading sequence.properties..."); sequencePropertiesHost.setToolTipText("reading sequence.properties..."); jButton1.setText("OK Save Next"); jButton1.setToolTipText("Mark as OK, Save, and advance to next image. Ctrl+Enter can be used as well."); org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, okRadioButton, org.jdesktop.beansbinding.ELProperty.create("${enabled}"), jButton1, org.jdesktop.beansbinding.BeanProperty.create("enabled")); bindingGroup.addBinding(binding); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .addContainerGap() .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(okRadioButton) .add(problemRadioButton) .add(ignoreRadioButton)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(saveButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 69, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jPanel1Layout.createSequentialGroup() .add(jButton1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(loginButton))) .addContainerGap()) .add(sequencePropertiesHost) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .add(sequencePropertiesHost, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(saveButton) .add(jPanel1Layout.createSequentialGroup() .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(okRadioButton) .add(loginButton) .add(jButton1)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(problemRadioButton) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(ignoreRadioButton))) .addContainerGap(19, Short.MAX_VALUE)) ); commentSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); commentSplitPane.setResizeWeight(1.0); previousCommentEditorPane.setEditable(false); previousCommentEditorPane.setContentType("text/html"); // NOI18N // Set HTML renderer to use java system default font instead of Times New Roman java.awt.Font font = javax.swing.UIManager.getFont("Label.font"); String bodyRule = "body { font-family: " + font.getFamily() + "; " + "font-size: " + font.getSize() + "pt; }"; ((javax.swing.text.html.HTMLDocument)previousCommentEditorPane.getDocument()).getStyleSheet().addRule(bodyRule); jScrollPane1.setViewportView(previousCommentEditorPane); commentSplitPane.setTopComponent(jScrollPane1); jLabel1.setText("Enter your comments below:"); newCommentTextArea.setColumns(20); newCommentTextArea.setLineWrap(true); newCommentTextArea.setWrapStyleWord(true); newCommentTextArea.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { newCommentTextAreaKeyTyped(evt); } }); jScrollPane2.setViewportView(newCommentTextArea); org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE) .add(jPanel2Layout.createSequentialGroup() .add(jLabel1) .add(0, 0, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel2Layout.createSequentialGroup() .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 17, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 130, Short.MAX_VALUE)) ); commentSplitPane.setRightComponent(jPanel2); jPanel3.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); jPanel3.setAutoscrolls(true); statusLabel.setText("Waiting for status count..."); statusLabel.setMaximumSize(new java.awt.Dimension(1000, 17)); statusLabel.setMinimumSize(new java.awt.Dimension(50, 17)); org.jdesktop.layout.GroupLayout jPanel3Layout = new org.jdesktop.layout.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) ); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(commentSplitPane) .add(jPanel3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(commentSplitPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) ); bindingGroup.bind(); }// //GEN-END:initComponents private void okRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okRadioButtonActionPerformed }//GEN-LAST:event_okRadioButtonActionPerformed private void problemRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_problemRadioButtonActionPerformed }//GEN-LAST:event_problemRadioButtonActionPerformed private void ignoreRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ignoreRadioButtonActionPerformed }//GEN-LAST:event_ignoreRadioButtonActionPerformed protected transient WalkImageSequence walkImageSequence = null; public synchronized WalkImageSequence getWalkImageSequece() { return walkImageSequence; } public synchronized void setWalkImageSequece(final WalkImageSequence walkImageSequence) { if ( this.walkImageSequence!=null ) { this.walkImageSequence.removePropertyChangeListener(pc); } if ( walkImageSequence==null ) { loginButton.setToolTipText( "" ); } else { loginButton.setToolTipText( "Log in to site" ); loginButton.setEnabled(true); } this.walkImageSequence = walkImageSequence; if ( walkImageSequence!=null ) { walkImageSequence.addPropertyChangeListener( pc ); } displayRecord(null); sequencePropertiesHost.setText("reading sequence.properties..."); sequencePropertiesHost.setToolTipText(""); if ( walkImageSequence!=null ) { loginButton.setEnabled(false); Runnable run= new Runnable() { @Override public void run() { initQualitySequeuce(); URI uri= walkImageSequence.getQCFolder(); sequencePropertiesHost.setText(uri.toString()); sequencePropertiesHost.setToolTipText(uri.toString()); loginButton.setEnabled(true); int index= walkImageSequence.getIndex(); if ( index>=0 ) { QualityControlSequence qseq= walkImageSequence.getQualityControlSequence(); if ( qseq==null || qseq.getQualityControlRecord(index)!=null ) { saveButton.setEnabled(true); setStateButtonedEnabled(true); } } if ( uri.getScheme().equals("file") ) { // log in automatically if it's not restricted login(); } } }; new Thread( run ).start(); } } /** * provide method for programmatically setting status. * @param text text to accompany status. * @param status the status. * @see PngWalkTool#setQCStatus(java.lang.String, org.autoplot.pngwalk.QualityControlRecord.Status) */ protected void setStatus( String text, QualityControlRecord.Status status ) { if ( text==null ) text=""; qcRecord.setStatus(status); qcRecord.setNewCommentText(System.getProperty("user.name"), text ); qcRecord.save(); // re-initialize record display with updated content walkImageSequence.getQualityControlSequence().refreshQCTotals(); displayRecord(qcRecord); } private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed String text= newCommentTextArea.getText(); QualityControlRecord.Status status; if ( ignoreRadioButton.isSelected() ) { status= QualityControlRecord.Status.IGNORE; } else if ( problemRadioButton.isSelected() ) { status= QualityControlRecord.Status.PROBLEM; } else if ( okRadioButton.isSelected() ) { status= QualityControlRecord.Status.OK; } else { status= QualityControlRecord.Status.PROBLEM; } setStatus( text, status ); }//GEN-LAST:event_saveButtonActionPerformed private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loginButtonActionPerformed login(); }//GEN-LAST:event_loginButtonActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed LoggerManager.logGuiEvent(evt); okRadioButton.setSelected(true); saveButtonActionPerformed(evt); walkImageSequence.next(); }//GEN-LAST:event_jButton1ActionPerformed private void newCommentTextAreaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_newCommentTextAreaKeyTyped if ( evt.isControlDown() && evt.getKeyChar()=='\n' ) { okRadioButton.setSelected(true); saveButtonActionPerformed(null); walkImageSequence.next(); evt.consume(); } }//GEN-LAST:event_newCommentTextAreaKeyTyped // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSplitPane commentSplitPane; private javax.swing.JRadioButton ignoreRadioButton; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JButton loginButton; private javax.swing.JTextArea newCommentTextArea; private javax.swing.JRadioButton okRadioButton; private javax.swing.JEditorPane previousCommentEditorPane; private javax.swing.JRadioButton problemRadioButton; private javax.swing.JButton saveButton; private javax.swing.JTextField sequencePropertiesHost; private javax.swing.ButtonGroup statusButtonGroup; private javax.swing.JLabel statusLabel; private org.jdesktop.beansbinding.BindingGroup bindingGroup; // End of variables declaration//GEN-END:variables public static void main(String[] args) { JFrame f = new JFrame(); f.add(new QualityControlPanel(null)); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private void setStateButtonedEnabled(boolean b) { for ( Enumeration e= statusButtonGroup.getElements(); e.hasMoreElements(); ) { e.nextElement().setEnabled(b); } } }