#java #swing #jpanel
#java #качать #jpanel
Вопрос:
Следующий код должен считывать файл, содержащий набор молекулярных структур, затем добавлять кучу JPanels (равную количеству молекул) и создавать молекулу на каждой панели. Я получаю правильное количество панелей во время выполнения. Однако на первой панели отображается только первая молекула?
Комментарии:
1. Также может потребоваться код для MolViewer.
2. MolViewer рисует JPanel молекулой. Когда я вручную добавляю кучу панелей MolViewer, таких как molViewer1 = new MolViewer(); molViewer2 = new MolViewer(); он работал нормально. Я предполагаю, что это связано со ссылками на панели. В соответствующей заметке возможно ли сгенерировать набор JPanels, таких как Jpanel1, JPanel2, в цикле с индексом.
3. @lochi: это нам мало что говорит. Например, насколько нам известно, у вас есть статическая переменная в MolViewer, которая ограничивает вашу способность отображать несколько молекул. Код может помочь нам разобраться в этом. Но … зависит от вас.
4. Кроме того, вы добавили инструкции отладки в свой код?
5. изображение = новое изображение буфера (this.getPreferredSize().width, this.getPreferredSize().height, BufferedImage . TYPE_INT_ARGB); исправлена проблема
Ответ №1:
drawMolViewPanel()
Функция кажется немного перегруженной. Во-первых, panes
список кажется в основном временным (вы добавляете в него объекты, затем из этого списка добавляете их в MolTable
собственную коллекцию панелей; я не думаю, что вам это нужно). Если я правильно понимаю функцию, это делает то же самое и имеет для меня больше смысла:
public void drawMolViewPanel(String sdf) throws FileNotFoundException, CDKException
{
ReadSDF(sdf);
this.removeAll();
for (int i = 0; i < this.fragments.size(); i )
{
MolViewer mv = new MolViewer();
mv.setMolecule((Molecule)this.fragments.get(i));
this.add(mv);
}
this.revalidate();
this.repaint();
}
К сожалению, я не совсем уверен, что это ваша проблема.
Комментарии:
1. Да, это должно сработать. Проблема была с частью MolViewer. image = new BufferedImage(this.getPreferredSize().width, this.getPreferredSize().height, BufferedImage . TYPE_INT_ARGB); исправлена проблема
Ответ №2:
Правильно ли работает ReadSDF? Не зная гораздо больше, может быть возможно, что фрагменты не инициализируются должным образом, поэтому, когда вы переходите к доступу к элементам, он не работает должным образом, генерируется исключение, которое перехватывается и игнорируется чем-то более высоким.
Код Кори Ларсона кажется мне, что он должен работать. Логически это то же самое.
Я заметил, что там, где вы переопределяете ‘paintComponent’ в MolViewer, вы вызываете super.paintComponents (g) (метод контейнера), а не paintComponent (метод JComponent). Я недостаточно поработал с графикой в swing, чтобы узнать, правильно ли это, поэтому не стесняйтесь игнорировать это.
Кроме того, (очень) маленькая вещь: вы используете LinkedLists для произвольного доступа. ArrayList был бы лучшей реализацией в целом, если вы обращаетесь с индексным номером.
Комментарии:
1. изображение = новое изображение буфера (this.getPreferredSize().width, this.getPreferredSize().height, BufferedImage . TYPE_INT_ARGB); исправлена проблема