Create Graphical User Interface for Checker Options
Create Graphical User Interface for Checker Options
To support checker configuration from GUI, an editor is required. We are going to create a simple editor with three radio buttons to set the preferred behavior. The options will be "Reactant Side", "Product Side", and "Both Sides" respectively. The class is placed to the same package as the checker class is.
Create an editor class
Extend the DefaultCheckerEditor class, create a JPanel with some JRadioButton instances, and bind the radio buttons to the Checker instance.
Overriding getCustomComponent method will add the JPanel to the editor, while getEditorComponent sets up the editor to represent the passed Checker’s state. Changing the radio buttons will alter the state of the Checker.
Download the example and find "DuplicateAtomMapCheckerEditor.java".
public
class
DuplicateAtomMapCheckerEditor
extends
DefaultCheckerEditor {
/** the main component */
private
JPanel mainPanel =
null
;
/** radio button for reactant only */
private
JRadioButton reactantRadio =
null
;
/** radio button for product only */
private
JRadioButton productRadio =
null
;
/** radio button for both */
private
JRadioButton bothRadio =
null
;
/** the checker instance being edited */
private
DuplicateAtomMapChecker checker =
null
;
/** * Constructs an editor component for duplicate atom map checker. */
public
DuplicateAtomMapCheckerEditor() {
ButtonGroup group =
new
ButtonGroup();
group.add(getReactantRadio());
group.add(getProductRadio());
group.add(getBothRadio());
}
@Override
protected
Component getCustomComponent() {
if
(mainPanel ==
null
) {
// create a panel and set up a layout
mainPanel =
new
JPanel();
mainPanel.setLayout(
new
BoxLayout(mainPanel, BoxLayout.Y_AXIS));
// add control components
mainPanel.add(getReactantRadio());
mainPanel.add(getProductRadio());
mainPanel.add(getBothRadio());
// set up some design
mainPanel.setBackground(Color.WHITE);
mainPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
return
mainPanel;
}
@Override
public
JComponent getEditorComponent(StructureChecker checker) {
if
(checker
instanceof
DuplicateAtomMapChecker) {
this
.checker = (DuplicateAtomMapChecker) checker;
switch
(
this
.checker.getReactionSide()) {
case
REACTANT:
getReactantRadio().setSelected(
true
);
break
;
case
PRODUCT:
getProductRadio().setSelected(
true
);
break
;
case
BOTH:
default
:
getBothRadio().setSelected(
true
);
break
;
}
}
else
{
this
.checker =
null
;
}
return
super
.getEditorComponent(
this
.checker);
}
/** * Initializes and returns the radio button for reactant only selection. * * @return the radio button for reactant only selection */
private
JRadioButton getReactantRadio() {
if
(reactantRadio ==
null
) {
reactantRadio =
new
JRadioButton(
"Search in reactants"
);
reactantRadio.addActionListener(
new
ActionListener() {
@Override
public
void
actionPerformed(ActionEvent e) {
if
(reactantRadio.isSelected()) {
checker.setReactionSide(ReactionSide.REACTANT);
}
}
});
}
return
reactantRadio;
}
/** * Initializes and returns the radio button for product only selection. * * @return the radio button for product only selection */
private
JRadioButton getProductRadio() {
if
(productRadio ==
null
) {
productRadio =
new
JRadioButton(
"Search in products"
);
productRadio.addActionListener(
new
ActionListener() {
@Override
public
void
actionPerformed(ActionEvent e) {
if
(productRadio.isSelected()) {
checker.setReactionSide(ReactionSide.PRODUCT);
}
}
});
}
return
productRadio;
}
/** * Initializes and returns the radio button for both selection. * * @return the radio button for both selection */
private
JRadioButton getBothRadio() {
if
(bothRadio ==
null
) {
bothRadio =
new
JRadioButton(
"Search in reactants and products"
);
bothRadio.addActionListener(
new
ActionListener() {
@Override
public
void
actionPerformed(ActionEvent e) {
if
(bothRadio.isSelected()) {
checker.setReactionSide(ReactionSide.BOTH);
}
}
});
}
return
bothRadio;
}
}
Bind the editor to the checker
The new editor can be attached to the checker by adding a new option to the @CheckerInfo annotation in DuplicateAtomMapChecker class.
@CheckerInfo
(
name =
"Duplicate Atom Map Checker"
,
description =
"Checks for mapping duplicates in a reaction."
,
editorClassName =
"custom.checkers.DuplicateAtomMapCheckerEditor"
,
noErrorMessage =
"No duplicate mappings found"
,
moreErrorMessage =
"duplicate mappings found"
,
actionStringToken =
"duplicateatommap"
)
Create a new JAR file, and export both DuplicateAtomMapChecker and DuplicateAtomMapCheckerEditor classes. Replace the previously generated JAR file with this one. Overwrite the duplicateatommapchecker.jar in home/MyCustomCheckers folder.
Ready to edit
The new editor is available and works in all Structure Checker related ChemAxon products.