Guest User

Untitled

a guest
Feb 20th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. import java.awt.BorderLayout;
  2. import java.awt.Component;
  3. import java.awt.EventQueue;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.ArrayList;
  7.  
  8. import javax.swing.AbstractListModel;
  9. import javax.swing.DefaultListModel;
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JList;
  13. import javax.swing.JScrollPane;
  14. import javax.swing.JTextField;
  15. import javax.swing.ListCellRenderer;
  16.  
  17. public class Test {
  18.  
  19. private JFrame frame;
  20. private ArrayList<Person> persons = new ArrayList<>();
  21.  
  22. public static void main(String[] args) {
  23. EventQueue.invokeLater(new Runnable() {
  24. public void run() {
  25. try {
  26. Test window = new Test();
  27. window.frame.setVisible(true);
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. });
  33. }
  34.  
  35. public Test() {
  36. initialize();
  37. }
  38.  
  39. private void initialize() {
  40. frame = new JFrame();
  41. frame.setBounds(100, 100, 450, 300);
  42. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  43. frame.getContentPane().setLayout(new BorderLayout());
  44. for (int i = 0; i < 111111; i++) {
  45. Person p = new Person(i);
  46. persons.add(p);
  47. }
  48. PersonList pl = new PersonList(persons);
  49. JScrollPane sp = new JScrollPane(pl);
  50. frame.getContentPane().add(sp, BorderLayout.CENTER);
  51. JButton addPerson = new JButton("add person");
  52. addPerson.addActionListener(new ActionListener() {
  53.  
  54. @Override
  55. public void actionPerformed(ActionEvent e) {
  56. Person p = new Person(166);
  57. /*
  58. * This will make the list dissapear.
  59. */
  60. // persons.add(p);
  61. // pl.repaint();
  62. // pl.revalidate();
  63. /*
  64. * This will cause high memory usage on each button click.
  65. */
  66. jlist.Test.PersonList.PersonModel m = (jlist.Test.PersonList.PersonModel) pl.getModel();
  67. m.add(p);
  68. }
  69. });
  70. frame.getContentPane().add(addPerson, BorderLayout.PAGE_END);
  71.  
  72. }
  73.  
  74. @SuppressWarnings("serial")
  75. private class PersonList extends JList<Person> {
  76. private ArrayList<Person> listPersons;
  77.  
  78. public PersonList(ArrayList<Person> persons) {
  79. this.listPersons = persons;
  80. setModel(new PersonModel());
  81. setCellRenderer(new PersonRenderer());
  82. }
  83.  
  84. private class PersonRenderer extends JTextField implements ListCellRenderer<Person> {
  85.  
  86. @Override
  87. public Component getListCellRendererComponent(JList<? extends Person> list, Person value, int index,
  88. boolean isSelected, boolean cellHasFocus) {
  89. setText("height: " + value.getHeight());
  90. return this;
  91. }
  92.  
  93. }
  94.  
  95. private class PersonModel extends AbstractListModel<Person> {
  96. public void add(Person p) {
  97. listPersons.add(p);
  98. fireContentsChanged(this, listPersons.size(), listPersons.size() - 1);
  99. }
  100.  
  101. @Override
  102. public Person getElementAt(int arg0) {
  103. return listPersons.get(arg0);
  104. }
  105.  
  106. @Override
  107. public int getSize() {
  108. return listPersons.size();
  109. }
  110.  
  111. }
  112. }
  113.  
  114. private class Person {
  115. private int height;
  116.  
  117. public Person(int height) {
  118. this.setHeight(height);
  119. }
  120.  
  121. @SuppressWarnings("unused")
  122. public int getHeight() {
  123. return height;
  124. }
  125.  
  126. public void setHeight(int height) {
  127. this.height = height;
  128. }
  129. }
  130. }
Add Comment
Please, Sign In to add comment