Причина этого в том, что вы запускаете цикл for в потоке отправки событий (см. Событие Dispatch Thread ). Это поток, в котором происходят все взаимодействия с пользовательским интерфейсом.
Если вы выполняете длинную задачу, вы должны запустить ее в другом потоке, чтобы пользовательский интерфейс сохранял отзывчивость. Если вам нужно внести изменения в пользовательский интерфейс, например, изменить текст в вашей JTextPane и установить позицию каретки из другого потока, кроме потока отправки событий, вам нужно вызвать либо EventQueue.invokeLater()
, либо EventQueue.invokeAndWait()
(см. EventQueue ).
Я думаю, что инициируемые события от установки позиции каретки поставлены в очередь в вашем случае и могут обрабатываться только после завершения цикла (поскольку оба они обрабатываются в потоке отправки событий). Поэтому вы должны попробовать что-то вроде этого:
@Override
public void actionPerformed(ActionEvent e)
{
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < iter; i++)
{
final String display = String.format("%10d\n", i);
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
append(display);
}
});
} catch (Exception e) {
e.printStackTrace();
}
} // end for i
}
}).start();
}
Может быть даже лучше, если вы вызываете EventQueue.invokeAndWait
только после x итераций и кешируете предыдущие результаты, которые необходимо отобразить.
id просто attr_protected, поэтому вы не можете использовать массовое назначение для его установки. Однако при настройке вручную он просто работает:
o = SomeObject.new
o.id = 8888
o.save!
o.reload.id # => 8888
Я не уверен, какова была исходная мотивация, но я делаю это при преобразовании моделей ActiveHash в ActiveRecord. ActiveHash позволяет использовать ту же семантику own_to в ActiveRecord, но вместо того, чтобы выполнять миграцию и создавать таблицу и нести накладные расходы на базу данных при каждом вызове, вы просто сохраняете свои данные в файлах yml. Внешние ключи в базе данных ссылаются на идентификаторы в памяти в yml.
ActiveHash отлично подходит для раскрывающихся списков и небольших таблиц, которые меняются нечасто и изменяются только разработчиками. Поэтому при переходе от ActiveHash к ActiveRecord проще всего сохранить все ссылки на внешние ключи одинаковыми.
Попробуйте
a_post = Post.new do |p|
p.id = 10
p.title = 'Test'
p.save
end
, который должен дать Вам, что Вы ищете.
На самом деле оказывается что выполнение следующих работ:
p = Post.new(:id => 10, :title => 'Test')
p.save(false)
Как объяснил ранее, это вызвано Cleartype в Internet Explorer - но есть обходной путь, который по крайней мере сделает этот вопрос терпимой.
$('#navigation').fadeIn(500, function(){
if ($.browser.msie){this.style.removeAttribute('filter');}
});
, что должно привести то, чтобы очистить прозрачность и, таким образом, сделать текст нормально.
Это все еще не красиво, к сожалению.
-121--3465255-Как отмечает Джефф, удостоверение личности ведет себя так, как будто это attr_protected. Чтобы предотвратить это, вам необходимо переопределить список атрибутов защищенных по умолчанию. Будьте осторожны, делая это где-нибудь, что информация о атрибуте может прийти снаружи. Идентификационное поле защищено по умолчанию по умолчанию по умолчанию.
class Post < ActiveRecord::Base
private
def attributes_protected_by_default
[]
end
end
(Испытано с Activerecord 2.3.5)