JPanels, кроме первого, не нарисованного

#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); исправлена проблема