Newer
Older
package cz.fidentis.analyst.batch;
import cz.fidentis.analyst.core.ControlPanel;
import cz.fidentis.analyst.project.ProjectTopComp;
import cz.fidentis.analyst.face.HumanFaceFactory;
import cz.fidentis.analyst.mesh.io.MeshObjExporter;
import static cz.fidentis.analyst.registration.RegistrationPanel.getStaticIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.openide.filesystems.FileChooserBuilder;
/**
* A control panel for bath (N:N) processing.
*
* @author Radek Oslejsek
*/
public class BatchPanel extends ControlPanel {
public static final String SIMILARITY_COMPLETE_HD = "Two-way HD of all pairs (very slow)";
public static final String SIMILARITY_APPROX_HD = "Approximate HD using selected face (fast)";
public static final String ACTION_COMMAND_COMPUTE_ICP = "Compute ICP and average face";
public static final String ACTION_COMMAND_COMPUTE_SIMILARITY = "Compute similarity";
public static final String ACTION_COMMAND_SHOW_SELECTED_FACE = "Show selected face";
public static final String ACTION_COMMAND_EXPORT_SIMILARITY = "Export similarity";
/*
* Mandatory design elements
*/
public static final String ICON = "registration28x28.png";
public static final String NAME = "Batch Processing";
private final List<Path> paths = new ArrayList<>();
private final HumanFaceFactory factory = new HumanFaceFactory();
/**
* Constructor.
* @param action Action listener
* @throws IllegalArgumentException if the {@code faces} argument is empty or missing
*/
public BatchPanel(ActionListener action, List<Path> faces) {
this.setName(NAME);
initComponents();
paths.stream().forEach(f -> {
String name = f.toString();
name = name.substring(name.lastIndexOf(File.separatorChar) + 1, name.length());
jComboBox1.addItem(name);
}); // Action event is triggered automatically by the jComboBox1 with the first item set as selected
jButton1.addActionListener(createListener(action, ACTION_COMMAND_COMPUTE_ICP));
spinSlider1.initInteger(1000, 0, 5000, 1); // downsampling strength
jComboBox2.addItem(SIMILARITY_APPROX_HD);
jComboBox2.addItem(SIMILARITY_COMPLETE_HD);
jButton4.addActionListener(createListener(action, ACTION_COMMAND_COMPUTE_SIMILARITY));
jButton5.addActionListener((ActionEvent e) -> { // [Export AVG face]
exportAvgFace();
});
jButton6.addActionListener(createListener(action, ACTION_COMMAND_EXPORT_SIMILARITY)); // [Export results]
jComboBox1.addActionListener(createListener(action, ACTION_COMMAND_SHOW_SELECTED_FACE));
jButtonInfo1.addActionListener((ActionEvent e) -> {
showSimilarityInfo();
});
jButtonInfo2.addActionListener((ActionEvent e) -> {
showDatasetInfo();
});
}
@Override
public ImageIcon getIcon() {
return getStaticIcon();
}
public boolean getHdAutoCrop() {
return jCheckBox5.isSelected();
}
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
* Sets the similarity export button
*
* @param on set on or off
*/
public void enableSimilatiryExport(boolean on) {
jButton6.setEnabled(on);
}
/**
* Returns index of a face that is selected or -1
* @return index of a face that is selected or -1
*/
public int getSelectedFaceIndex() {
return (jComboBox1.getItemCount() == 0) ? -1 : jComboBox1.getSelectedIndex();
}
/**
* Returns the face select in the combo box
* @return the face select in the combo box
*/
public HumanFace getSelectedFace() {
if (jComboBox1.getItemCount() == 0) {
return null;
}
//Logger.print("AAA " + paths.get(jComboBox1.getSelectedIndex()).toString());
String id = factory.loadFace(paths.get(jComboBox1.getSelectedIndex()).toFile());
return factory.getFace(id);
}
/**
* Method logic:
* <ul>
* <li>If {@code face} is not {@code null} and the previous AVG face exists,
* then the AVG face is replaced and selected.</li>
* <li>If {@code face} is not {@code null} and no previous AVG face exists,
* then the AVG face is added and selected.</li>
* <li>If {@code face} is {@code null} and the previous AVG face exists,
* then the previous AVG face is preserved and selected.</li>
* <li>If {@code face} is {@code null} and no previous AVG face exists,
* then nothing happens.</li>
* </ul>
*
* @param face new AVG face
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
public void addAndSelectAvgFace(HumanFace face) {
//this.avgFace = face;
// Copy existing ites of the combobox and clear it
List<String> items = new ArrayList<>();
for (int i = 0; i < jComboBox1.getItemCount(); i++) {
items.add(jComboBox1.getItemAt(i));
}
jComboBox1.removeAllItems();
// the logic:
if (face != null && haveAvgFace) {
paths.set(0, new File(face.getPath()).toPath()); // replace path
// do nothing with the combobox
} else if (face != null && !haveAvgFace) {
paths.add(0, new File(face.getPath()).toPath());
items.add(0, "Average face");
} else if (face == null && haveAvgFace) {
} else {
// do nothing at all
}
// Copy items back to the combobox.
// Action event is triggered automatically by the jComboBox1 with the first item set as selected
items.stream().forEach(i -> jComboBox1.addItem(i));
haveAvgFace = (face != null || haveAvgFace);
jButton5.setEnabled(haveAvgFace);
}
/**
* Returns paths to faces to be processed
* @return paths to faces to be processed
*/
public List<Path> getFacePaths() {
return Collections.unmodifiableList(paths);
}
/**
* Returns human face factory
*
* @return human face factory
*/
public HumanFaceFactory getHumanFaceFactory() {
return this.factory;
}
/**
* Returns the number of desired points, 0 for no downsampling
* @return the number of desired points, 0 for no downsampling
*/
public int getIcpUndersampling() {
return (int) spinSlider1.getValue();
}
/**
* Determines whether to compute average face.
* @return if {@code true}, then average face will be computed
*/
public boolean computeAvgFace() {
return this.jCheckBox1.isSelected();
}
/**
* Determines whether to scale during ICP registration.
* @return if {@code true}, then ICP scales
*/
public boolean scaleIcp() {
return jCheckBox4.isSelected();
}
/**
* Determines whether to show ICP transformation in the 3D scene
* @return if {@code true}, then ICP transformations are shown in the 3D scene
*/
public boolean showIcpPreview() {
return this.jCheckBox3.isSelected();
}
/**
* Determines whether to compute ICP transformations.
* @return if {@code true}, then ICP transformations will be computed
*/
public boolean computeICP() {
return this.jCheckBox2.isSelected();
}
/**
* Returns selected similarity strategy
* @return selected similarity strategy
*/
public String getSimilarityStrategy() {
return jComboBox2.getSelectedItem().toString();
}
private void showSimilarityInfo() {
JOptionPane.showMessageDialog(
this,
"<html>"
+ "<strong>" + SIMILARITY_APPROX_HD + "</strong>: <br/>"
+ "First, a relative Hausdorff distance is computed between all faces and the selected face T.<br/>"
+ "Then, the distance of each pair A,B is estimated as the difference between A,T and B,T.<br/>"
+ "<br/>"
+ "<strong>" + SIMILARITY_COMPLETE_HD + "</strong>: <br/>"
+ "Hausdorff distance is computed for all paris in both directions.<br/>"
+ "<br/>"
+ "<strong>HD auto-crop</strong>: <br/>"
+ "If selected, then only overlapping parts of faces are included<br/>"
+ "in the calculation of Hausdorff distance.<br/>"
+ "<br/>"
+ "</html>",
"Distance computation strategies",
JOptionPane.INFORMATION_MESSAGE
);
}
private void showDatasetInfo() {
JOptionPane.showMessageDialog(
this,
"<html>"
+ "In the <strong>Registration</strong> step, the selected face is used<br>"
+ "as an initial face for the computation of average face.<br/>"
+ "Newly computed average face is automatically added to the dataset and selected.<br/>"
+ "<br/>"
+ "In the <strong>Similarity computation</strong> step, the selected face is used<br/>"
+ "as a template (intermediate) face through which the mutual distances are computed.<br/>"
+ "<br/>"
+ "Selected face is shown in the scene.<br/>"
+ "<br/>"
+ "</html>",
"Distance computation strategies",
JOptionPane.INFORMATION_MESSAGE
);
}
if (!haveAvgFace) {
return;
}
File file = new FileChooserBuilder(ProjectTopComp.class)
.setTitle("Specify a file to save")
.setDefaultWorkingDirectory(new File(System.getProperty("user.home")))
.setFileFilter(new FileNameExtensionFilter("obj files (*.obj)", "obj"))
.showSaveDialog();
if (file != null) {
try {
String id = factory.loadFace(paths.get(0).toFile()); // first face is average
new MeshObjExporter(factory.getFace(id).getMeshModel()).exportModelToObj(file);
} catch (IOException ex) {
Logger.print(ex.toString());
}
}
}
/**
* 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
jCheckBox1 = new javax.swing.JCheckBox();
jCheckBox2 = new javax.swing.JCheckBox();
jCheckBox3 = new javax.swing.JCheckBox();
jCheckBox4 = new javax.swing.JCheckBox();
spinSlider1 = new cz.fidentis.analyst.core.SpinSlider();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jComboBox1 = new javax.swing.JComboBox<>();
jButtonInfo2 = new javax.swing.JButton();
jPanel3 = new javax.swing.JPanel();
jComboBox2 = new javax.swing.JComboBox<>();
jButton4 = new javax.swing.JButton();
jButtonInfo1 = new javax.swing.JButton();
jButton6 = new javax.swing.JButton();
jCheckBox5 = new javax.swing.JCheckBox();
setPreferredSize(new java.awt.Dimension(600, 600));
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jPanel1.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 12))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButton1.text")); // NOI18N
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jLabel2.text")); // NOI18N
jCheckBox1.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(jCheckBox1, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jCheckBox1.text_1")); // NOI18N
jCheckBox1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jCheckBox1ActionPerformed(evt);
}
});
jCheckBox2.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(jCheckBox2, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jCheckBox2.text")); // NOI18N
jCheckBox2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jCheckBox2ActionPerformed(evt);
}
});
jCheckBox3.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(jCheckBox3, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jCheckBox3.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jCheckBox4, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jCheckBox4.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton5, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButton5.text")); // NOI18N
jButton5.setEnabled(false);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jCheckBox3)
.addComponent(jCheckBox1)
.addComponent(jCheckBox2)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton5))
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jCheckBox4))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(spinSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(jLabel2)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14, Short.MAX_VALUE)
.addComponent(jCheckBox4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jCheckBox2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jCheckBox3)
.addGap(18, 18, 18)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jButton5))
.addContainerGap())
);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jPanel2.border.title_1"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 12))); // NOI18N
jLabel1.setFont(new java.awt.Font("Ubuntu", 1, 15)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jLabel1.text")); // NOI18N
jButtonInfo2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/info.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButtonInfo2, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButtonInfo2.text")); // NOI18N
jButtonInfo2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
jButtonInfo2.setBorderPainted(false);
jButtonInfo2.setFocusPainted(false);
jButtonInfo2.setFocusable(false);
jButtonInfo2.setRequestFocusEnabled(false);
jButtonInfo2.setRolloverEnabled(false);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jButtonInfo2)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButtonInfo2)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
);
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jPanel3.border.title_1"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 12))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton4, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButton4.text")); // NOI18N
jButtonInfo1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/info.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButtonInfo1, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButtonInfo1.text")); // NOI18N
jButtonInfo1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
jButtonInfo1.setBorderPainted(false);
jButtonInfo1.setFocusPainted(false);
jButtonInfo1.setFocusable(false);
jButtonInfo1.setRequestFocusEnabled(false);
jButtonInfo1.setRolloverEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(jButton6, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jButton6.text")); // NOI18N
jButton6.setEnabled(false);
jCheckBox5.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(jCheckBox5, org.openide.util.NbBundle.getMessage(BatchPanel.class, "BatchPanel.jCheckBox5.text")); // NOI18N
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jButton4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jButton6))
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jCheckBox5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jButtonInfo1)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jCheckBox5))
.addComponent(jButtonInfo1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton4)
.addComponent(jButton6))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(99, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox2ActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jCheckBox2ActionPerformed
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox1ActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jCheckBox1ActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jButton1ActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JButton jButtonInfo1;
private javax.swing.JButton jButtonInfo2;
private javax.swing.JCheckBox jCheckBox1;
private javax.swing.JCheckBox jCheckBox2;
private javax.swing.JCheckBox jCheckBox3;
private javax.swing.JCheckBox jCheckBox4;
private javax.swing.JCheckBox jCheckBox5;
private javax.swing.JComboBox<String> jComboBox1;
private javax.swing.JComboBox<String> jComboBox2;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private cz.fidentis.analyst.core.SpinSlider spinSlider1;
// End of variables declaration//GEN-END:variables