Проблема связана с фокусировкой на основной панели, KeyListener
будет генерировать события только тогда, когда компонент, прослушиватель которого зарегистрирован, должен быть сконфигурирован для ОС и HAS-фокус.
Очевидно, что когда кнопка нажата, он получает фокус, а это означает, что никто из других компонентов не может ответить.
Основной ответ: использование Use Key Bindings API .
Есть несколько вариантов, которые вы можете сделать, вы можете использовать текущий контейнер для регистрации привязок клавиш против, например ...
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
JButton btnC3 = new JButton("");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), "c3");
am.put("c3", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
btnC3.doClick();
}
});
btnC3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// play c
try {
keys.playNote(Notes.c3.getValue());
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (InvalidMidiDataException e2) {
e2.printStackTrace();
}
}
});
JButton btnD3 = new JButton("");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "d3");
am.put("d3", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
btnD3.doClick();
}
});
, или вы можете зарегистрировать их в отдельных компонентах. Выбор в основном сводится к тому, насколько вы хотите использовать решение.
Например, вы можете создать Action
, который может быть применен как к JButton
, так и к ключу, что означает, что вы не Вам нужно программно нажать кнопку.
Например ...
public class NoteAction extends AbstractAction {
private Note note;
private Keys keys;
public NoteAction(Note note, Keys keys) {
this.note = note;
this.keys = keys;
}
@Override
public void actionPerformed(ActionEvent e) {
keys.playNote(note.getValue());
}
}
(У меня нет вашего кода, поэтому я просто делаю некоторые из имена классов вверх)
Тогда вы могли бы просто использовать ...
NoteAction noteAction = new NoteAction(Notes.d3, keys);
JButton btnC3 = new JButton(noteAction);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), "c3");
am.put("c3", noteAction);
, чтобы настроить его.
См. Как использовать действия для более подробной информации
Из руководства MySQL
Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в круглые скобки и разделен запятыми. Пример:
blockquote>INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
mysql позволяет вам вставлять сразу несколько строк INSERT manual
Insert into table(col1,col2) select col1,col2 from table_2;
Перейдите по адресу: http: //dev.mysql.com/doc/refman/5.5/en/insert.html
insert into select from
производительности? это так же быстро, как объемная вставка?
– hiway
30 January 2018 в 03:53
В большинстве случаев вы не работаете в клиенте MySQL, и вы должны вставлять вставки вместе с помощью соответствующего API.
Например. в JDBC:
connection con.setAutoCommit(false);
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();
prepStmt.setString(1,mgrnum2);
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();
int [] numUpdates=prepStmt.executeBatch();
Запрос данных с информацией о загрузке намного лучше, но некоторые серверы, такие как godaddy, ограничивают эту опцию на общем хостинге, поэтому остаются только две опции, а затем одна запись вставки на каждой итерации или вставке в пакет, но вставка пакета имеет свою ограниченность символов, если ваш запрос превышает это количество символов, заданных в mysql, тогда ваш запрос выйдет из строя, поэтому я предлагаю вставлять данные в куски с пакетной вставкой, это сведёт к минимуму количество соединений, установленных с database.best из удачливых парней