JList, содержащий JTextAreas, отображает toString () JTextAreas вместо JTextArea - PullRequest
2 голосов
/ 23 июля 2011

Я использую JList и пытаюсь использовать JTextAreas (который реализует ListCellRenderer) для ячеек.Это не работаетВ ячейках просто отображается ListCellRenderer.toString () вместо действительной JTextArea.Может ли кто-нибудь помочь?Спасибо.


  DefaultListModel listModel = new DefaultListModel();
  JList list = new JList(listModel);
  add(list);

class ButtonListener implements ActionListener() {
  public void actionPerformed(ActionEvent e){
    listModel.clear();
    for (String s : stringArray) {
      listModel.addElement(new Listm(s));
    }
  }
}

class Listm extends JTextArea implements ListCellRenderer {
  protected Listm(String text) {
   setText(text); //Outputting the text element displays the desired String
  }

  public Component getListCellRendererComponent(JList list, Object object, int number, boolean bool, boolean bool2) {
    setPreferredSize(new Dimension(x, y));
    return this;
    }
  }
}

Ответы [ 3 ]

4 голосов
/ 23 июля 2011

Убедитесь, что вы вызываете setCellRenderer(), который устанавливает «делегат, который используется для рисования каждой ячейки в списке».

4 голосов
/ 23 июля 2011

Вы должны публиковать только скомпилированный код, и ваш код немного сбивает с толку.Вы не должны передавать текст в конструктор визуализатора, так как этот конструктор будет использоваться для одного визуализатора, который отображает все элементы в списке (если вы не хотите, чтобы все использовали один и тот же код).Вы не должны игнорировать параметр Object, который передается в ваш метод getListCellRendererComponent, поскольку именно эти данные отображает элемент рендерера.Например:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyGui extends JPanel {
   public static final String[] DATA = {"One\n1", "Two\n2", "Three\n3"};
   private DefaultListModel listModel = new DefaultListModel();
   private JList list = new JList(listModel);

   public MyGui() {
      list.setCellRenderer(new Listm(3, 30));
      add(new JScrollPane(list));
      for (String datum : DATA) {
         listModel.addElement(datum);
      }
   }

   private class Listm extends JTextArea implements ListCellRenderer {
      protected Listm(int rows, int cols) {
         super(rows, cols);
         setBorder(BorderFactory.createLineBorder(Color.blue));
      }

      public Component getListCellRendererComponent(JList list, Object value,
               int index, boolean isSelected, boolean cellHasFocus) {
         setText(value.toString());
         if (cellHasFocus) {
            setBackground(FOCUSED_COLOR);
         } else if (isSelected) {
            setBackground(SELECTED_COLOR);
         } else {
            setBackground(null);
         }
         return this;
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("MyGui");
      frame.getContentPane().add(new MyGui());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
0 голосов
/ 23 июля 2011

Вы должны использовать рендерер.У меня сейчас нет кода, но это довольно просто.Средство визуализации JList по умолчанию вызывает toString () и отображает результат.

...