📄 stockdatabasejdialog.java
字号:
selectUserDefinedDatabaseTable(selectedModelIndex);
}
private JPopupMenu getMyJTablePopupMenu() {
final JPopupMenu popup = new JPopupMenu();
javax.swing.JMenuItem menuItem = new JMenuItem("New", new javax.swing.ImageIcon(getClass().getResource("/images/16x16/filenew.png")));
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addNewSymbol();
}
});
popup.add(menuItem);
if(jTable2.getSelectedRowCount() >= 1) {
popup.addSeparator();
menuItem = new JMenuItem("Delete", new javax.swing.ImageIcon(getClass().getResource("/images/16x16/editdelete.png")));
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
deleteSelectedUserDefinedDatabase();
}
});
popup.add(menuItem);
}
return popup;
}
// For jTable2.
private TableModel getSymbolTableModel()
{
return new SymbolTableModel();
}
// For jTable1.
private TableModel getCodeSymbolTableModel()
{
return new CodeSymbolTableModel();
}
private void newFilter()
{
// I really have no idea what the second parameter is.
RowFilter<CodeSymbolTableModel, Integer> rf = null;
//If current expression doesn't parse, don't update.
try {
rf = RowFilter.regexFilter("^" + jTextField1.getText().toUpperCase());
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
((TableRowSorter<CodeSymbolTableModel>)jTable1.getRowSorter()).setRowFilter(rf);
}
private class CodeSymbolTableModel extends AbstractTableModel {
// For fast access purpose.
private final List<Symbol> symbols;
private final List<Code> codes;
public CodeSymbolTableModel() {
final MutableStockCodeAndSymbolDatabase database = new MutableStockCodeAndSymbolDatabase(mutableStockCodeAndSymbolDatabase);
List<Symbol> _symbols = database.getUserDefinedSymbol();
for(Symbol symbol : _symbols) {
database.removeUserDefinedSymbol(symbol);
}
symbols = Collections.unmodifiableList(new ArrayList<Symbol>(database.getSymbols()));
codes = Collections.unmodifiableList(new ArrayList<Code>(database.getCodes()));
}
@Override
public int getRowCount() {
return symbols.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex)
{
case 0:
return symbols.get(rowIndex);
case 1:
return codes.get(rowIndex);
}
return null;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Class getColumnClass(int c) {
return columnClasses[c];
}
public int findCodeOrSymbol(String string) {
final Symbol symbol = Symbol.newInstance(string);
final Code code = Code.newInstance(string);
final int symbolIndex = symbols.indexOf(symbol);
final int codeIndex = codes.indexOf(code);
if(symbolIndex >= 0) return symbolIndex;
if(codeIndex >= 0) return codeIndex;
return -1;
}
private final String[] columnNames = {"Code", "Symbol"};
private final Class[] columnClasses = {Code.class, Symbol.class};
}
private TableCellEditor getSymbolCellEditor() {
return new MyTableCellEditor();
}
private class MyTableCellEditor extends DefaultCellEditor {
private JFormattedTextField ftf;
public MyTableCellEditor() {
super(new JFormattedTextField());
ftf = (JFormattedTextField)getComponent();
ftf.setHorizontalAlignment(JTextField.TRAILING);
ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
//React when the user presses Enter while the editor is
//active. (Tab is handled as specified by
//JFormattedTextField's focusLostBehavior property.)
ftf.getInputMap().put(KeyStroke.getKeyStroke(
KeyEvent.VK_ENTER, 0),
"check");
ftf.getActionMap().put("check", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
final CodeSymbolTableModel model1 = (CodeSymbolTableModel)(StockDatabaseJDialog.this.jTable1.getModel());
final SymbolTableModel model2 = (SymbolTableModel)(StockDatabaseJDialog.this.jTable2.getModel());
final String searchedText = ftf.getText().toUpperCase();
final int modelIndex1 = model1.findCodeOrSymbol(searchedText);
final int modelIndex2 = model2.findSymbol(searchedText);
boolean isValid = true;
if(modelIndex1 >= 0) {
if(searchedText.length() > 0) {
if(searchedText.equals(ftf.getValue().toString()) == false) {
//JOptionPane.showMessageDialog(StockDatabaseJDialog.this, searchedText + " is conflicting with stock exchange server database.", "Conflicting", JOptionPane.INFORMATION_MESSAGE);
isValid = false;
}
}
}
else if(modelIndex2 >= 0) {
if(searchedText.length() > 0) {
if(searchedText.equals(ftf.getValue().toString()) == false) {
//JOptionPane.showMessageDialog(StockDatabaseJDialog.this, searchedText + " is conflicting with user defined database.", "Conflicting", JOptionPane.INFORMATION_MESSAGE);
isValid = false;
}
}
}
if(isValid) {
try {
ftf.commitEdit();
} catch (ParseException ex) {
log.error("", ex);
}
}
ftf.postActionEvent(); //inform the editor
}
});
}
//Override to invoke setValue on the formatted text field.
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected,
int row, int column) {
JFormattedTextField _ftf =
(JFormattedTextField)super.getTableCellEditorComponent(
table, value, isSelected, row, column);
_ftf.setValue(value);
return _ftf;
}
//Override to ensure that the value remains an Integer.
@Override
public Object getCellEditorValue() {
JFormattedTextField _ftf = (JFormattedTextField)getComponent();
Object o = _ftf.getValue();
if(o == null) return null;
return Symbol.newInstance(o.toString().toUpperCase());
}
//Override to check whether the edit is valid,
//setting the value if it is and complaining if
//it isn't. If it's OK for the editor to go
//away, we need to invoke the superclass's version
//of this method so that everything gets cleaned up.
@Override
public boolean stopCellEditing() {
JFormattedTextField _ftf = (JFormattedTextField)getComponent();
final CodeSymbolTableModel model1 = (CodeSymbolTableModel)(StockDatabaseJDialog.this.jTable1.getModel());
final SymbolTableModel model2 = (SymbolTableModel)(StockDatabaseJDialog.this.jTable2.getModel());
final String searchedText = _ftf.getText().toUpperCase();
final int modelIndex1 = model1.findCodeOrSymbol(searchedText);
final int modelIndex2 = model2.findSymbol(searchedText);
boolean isValid = true;
if(modelIndex1 >= 0) {
if(searchedText.length() > 0) {
if(searchedText.equals(_ftf.getValue().toString()) == false) {
JOptionPane.showMessageDialog(StockDatabaseJDialog.this, searchedText + " is conflicting with stock exchange server database.", "Conflicting", JOptionPane.INFORMATION_MESSAGE);
selectStockExchangeServerDatabaseTable(modelIndex1);
isValid = false;
}
}
}
else if(modelIndex2 >= 0) {
if(searchedText.length() > 0) {
if(searchedText.equals(_ftf.getValue().toString()) == false) {
JOptionPane.showMessageDialog(StockDatabaseJDialog.this, searchedText + " is conflicting with user defined database.", "Conflicting", JOptionPane.INFORMATION_MESSAGE);
selectUserDefinedDatabaseTable(modelIndex2);
isValid = false;
}
}
}
if (isValid) {
try {
_ftf.commitEdit();
} catch (ParseException ex) {
log.error("", ex);
}
}
return super.stopCellEditing();
}
}
private class SymbolTableModel extends AbstractTableModel {
// For fast access.
private final List<Symbol> symbols;
public SymbolTableModel() {
symbols = new ArrayList<Symbol>(StockDatabaseJDialog.this.mutableStockCodeAndSymbolDatabase.getUserDefinedSymbol());
}
public List<Symbol> getSymbols() {
return Collections.unmodifiableList(symbols);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return true;
}
public void removeRow(int index) {
symbols.remove(index);
this.fireTableRowsDeleted(index, index);
}
@Override
public int getRowCount() {
return symbols.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex)
{
case 0:
return symbols.get(rowIndex);
}
return null;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Class getColumnClass(int c) {
return columnClasses[c];
}
@Override
public void setValueAt(Object value, int row, int col) {
Symbol symbol = (Symbol)value;
symbols.remove(row);
symbols.add(row, symbol);
fireTableCellUpdated(row, col);
}
public int findSymbol(String string) {
return symbols.indexOf(Symbol.newInstance(string));
}
public int addNewSymbol() {
Symbol empty = Symbol.newInstance("");
//int index = symbols.indexOf(empty);
//if(index < 0) {
symbols.add(empty);
final int index = symbols.size() - 1;
this.fireTableRowsInserted(index, index);
//}
return index;
}
private final String[] columnNames = {"Code or Symbol"};
private final Class[] columnClasses = {Symbol.class};
}
private MutableStockCodeAndSymbolDatabase mutableStockCodeAndSymbolDatabase = null;
private MutableStockCodeAndSymbolDatabase result = null;
private static final Log log = LogFactory.getLog(StockDatabaseJDialog.class);
// Variables declaration - do not modify//GEN-BEGIN:variables
javax.swing.JButton jButton1;
javax.swing.JButton jButton2;
javax.swing.JButton jButton3;
javax.swing.JButton jButton4;
javax.swing.JPanel jPanel1;
javax.swing.JPanel jPanel2;
javax.swing.JPanel jPanel3;
javax.swing.JPanel jPanel4;
javax.swing.JPanel jPanel5;
javax.swing.JPanel jPanel6;
javax.swing.JPanel jPanel7;
javax.swing.JScrollPane jScrollPane1;
javax.swing.JScrollPane jScrollPane2;
javax.swing.JTable jTable1;
javax.swing.JTable jTable2;
javax.swing.JTextField jTextField1;
org.jdesktop.swingx.JXHeader jXHeader1;
// End of variables declaration//GEN-END:variables
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -