Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.BorderLayout;
- import java.awt.Component;
- import java.awt.EventQueue;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.ArrayList;
- import javax.swing.AbstractListModel;
- import javax.swing.DefaultListModel;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JList;
- import javax.swing.JScrollPane;
- import javax.swing.JTextField;
- import javax.swing.ListCellRenderer;
- public class Test {
- private JFrame frame;
- private ArrayList<Person> persons = new ArrayList<>();
- public static void main(String[] args) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- try {
- Test window = new Test();
- window.frame.setVisible(true);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
- public Test() {
- initialize();
- }
- private void initialize() {
- frame = new JFrame();
- frame.setBounds(100, 100, 450, 300);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.getContentPane().setLayout(new BorderLayout());
- for (int i = 0; i < 111111; i++) {
- Person p = new Person(i);
- persons.add(p);
- }
- PersonList pl = new PersonList(persons);
- JScrollPane sp = new JScrollPane(pl);
- frame.getContentPane().add(sp, BorderLayout.CENTER);
- JButton addPerson = new JButton("add person");
- addPerson.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Person p = new Person(166);
- /*
- * This will make the list dissapear.
- */
- // persons.add(p);
- // pl.repaint();
- // pl.revalidate();
- /*
- * This will cause high memory usage on each button click.
- */
- jlist.Test.PersonList.PersonModel m = (jlist.Test.PersonList.PersonModel) pl.getModel();
- m.add(p);
- }
- });
- frame.getContentPane().add(addPerson, BorderLayout.PAGE_END);
- }
- @SuppressWarnings("serial")
- private class PersonList extends JList<Person> {
- private ArrayList<Person> listPersons;
- public PersonList(ArrayList<Person> persons) {
- this.listPersons = persons;
- setModel(new PersonModel());
- setCellRenderer(new PersonRenderer());
- }
- private class PersonRenderer extends JTextField implements ListCellRenderer<Person> {
- @Override
- public Component getListCellRendererComponent(JList<? extends Person> list, Person value, int index,
- boolean isSelected, boolean cellHasFocus) {
- setText("height: " + value.getHeight());
- return this;
- }
- }
- private class PersonModel extends AbstractListModel<Person> {
- public void add(Person p) {
- listPersons.add(p);
- fireContentsChanged(this, listPersons.size(), listPersons.size() - 1);
- }
- @Override
- public Person getElementAt(int arg0) {
- return listPersons.get(arg0);
- }
- @Override
- public int getSize() {
- return listPersons.size();
- }
- }
- }
- private class Person {
- private int height;
- public Person(int height) {
- this.setHeight(height);
- }
- @SuppressWarnings("unused")
- public int getHeight() {
- return height;
- }
- public void setHeight(int height) {
- this.height = height;
- }
- }
- }
Add Comment
Please, Sign In to add comment