17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
1

JPanel.removeAll зависает

23.06.2013, 16:01. Показов 1952. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
на панель добавлено 10000 кнопок (ну, вот так вот надо ), в процессе работы программы вызываю panel.removeAll(), и программа виснет. В чем может быть подвох?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2013, 16:01
Ответы с готовыми решениями:

Добавление JPanel на JPanel, не отображаются те, которые добавлены сверху
Здравствуйте. У меня есть панель fon на которой у меня картинка с фоном и 15 панелей на которых...

Как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel
Подскажите как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel,...

Удаление JPanel кнопкой на этом же JPanel
Есть JPanel объекты, которые представляют собой панельки с какой - то информацией, на них есть...

Замена JPanel на JPanel в JFrame
У меня есть 3 класса. Первый класс Main наследуется от JFrame и в конструкторе установка размера и ...

18
Севак
23.06.2013, 21:41
  #2

Не по теме:

Предположу, что вы пишете какую-то игру с игровым полем 100*100 и хотите очистить это самое поле. Если да, то можно и нужно использовать не кнопки, а что-то другое, смотря какая у вас задача

1
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
23.06.2013, 23:16 3
Цитата Сообщение от Andrew_zp1 Посмотреть сообщение
в процессе работы программы вызываю panel.removeAll()
подозреваю что вызываете эту команду вы тоже какой либо кнопкой на этой панели - да?
1
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
24.06.2013, 09:42  [ТС] 4
Цитата Сообщение от mutagen Посмотреть сообщение
подозреваю что вызываете эту команду вы тоже какой либо кнопкой на этой панели - да?
Именно так, но для 1000 кнопок, или меньше, команда таки отрабатывает.

Добавлено через 1 минуту
Цитата Сообщение от Севак Посмотреть сообщение
можно и нужно использовать не кнопки, а что-то другое, смотря какая у вас задача
А что можно использовать? В любом случае это должен быть элемент на который можно повесить ActionListener.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
24.06.2013, 10:57 5
Цитата Сообщение от Andrew_zp1 Посмотреть сообщение
ну, вот так вот надо
Не надо. Это классический пример неправильного проектирования. Опишите, что Вы делаете, вернее, какую задачу решаете.
1
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
24.06.2013, 14:58  [ТС] 6
В базе данных лежат данные о пациентах, я должен выбрать данные о всех пациентах и вывести на панель, в столбик. далее по нажатию на какого-то пациента, должна вывестись на соседнюю панель информация о результатах его посещения.
Миниатюры
JPanel.removeAll зависает  
0
Заблокирован
24.06.2013, 15:03 7
а почему нельзя вывести список через JTable например?

Не по теме:

боже, иногда я чувствую себя просто отлично и поднимается настроение когда вижу как люди строят свои программы

0
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
24.06.2013, 15:25  [ТС] 8
теоретически да, можно. Есть 2 момента:
1. Когда я думал как это вообще сделать, то увидел, что ActionListnera для ячейки нету, а реализовать это дело с помощью addMouseListener я просто не догадался.
2. И это главное. Заказчик сказал, все должно быть наглядно. А я не уверен, что для ячейки таблицы можно переопределить ее отрисовку.

Цитата Сообщение от verylazy Посмотреть сообщение
боже, иногда я чувствую себя просто отлично и поднимается настроение когда вижу как люди строят свои программы
Обидно, если честно. Это моя первая более-менее серьезная программа. До этого весь опыт - лабораторные из курса универа. Более того, даже спросить не у кого, т.к. не в компании работаю и руководителей у меня нету.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
24.06.2013, 15:32 9
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Andrew_zp1 Посмотреть сообщение
В базе данных лежат данные о пациентах, я должен выбрать данные о всех пациентах и вывести на панель, в столбик. далее по нажатию на какого-то пациента, должна вывестись на соседнюю панель информация о результатах его посещения.
Слева JList с собственным ListCellRenderer-ом, который отрисовывает каждый элемент как Вам надо. По событию itemStateChanged с ItemState.SELECTED справа показывается вся информация.

Добавлено через 2 минуты
Цитата Сообщение от Andrew_zp1 Посмотреть сообщение
А я не уверен, что для ячейки таблицы можно переопределить ее отрисовку.
Не уверены? Спросите! Всё можно.

Добавлено через 4 минуты
Цитата Сообщение от Andrew_zp1 Посмотреть сообщение
Обидно, если честно. Это моя первая более-менее серьезная программа. До этого весь опыт - лабораторные из курса универа.
Зря обижаетесь. Программистом никто не рождается. И товарищ это сказал не из разряда позлорадствовать, а потому, что это вызывает мысли "у меня еще не все так плохо". Многим свойственно переживать по поводу своего уровня, а понимание, что бывает и ниже, очень помогает успокоиться. Ничего личного, к Вам это не относится.

Более того, даже спросить не у кого, т.к. не в компании работаю и руководителей у меня нету.
Спрашивайте на форумах, они для того и созданы.

Не по теме:

Вот мне в свое время было сложнее - тогда, когда Java изучал я, не было ни форумов, ни специалистов, ни литературы. Ничего кроме API, который надо было печатать.

4
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
24.06.2013, 15:36  [ТС] 10
Спасибо, попробую.
0
Заблокирован
24.06.2013, 15:43 11
точно точно я не злорадствовал
у меня самого полно комплексов, к тому же я не программист, изучаю на уровне хобби (трачу время на java вместо того, что бы играть в lineage)
вот узнал про Jlist, будет что почитать вечером
0
любитель покушать
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
24.06.2013, 16:01 12
Цитата Сообщение от verylazy Посмотреть сообщение
трачу время на java вместо того, что бы играть в lineage

Не по теме:

уж лучше тратить время на java, чем играть в linage, сам на wow угробил год жизни, щас жалею

0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.06.2013, 16:04 13
Цитата Сообщение от Севак Посмотреть сообщение
уж лучше тратить
Почему вы решили что это трата? вы тренируете ум, узнаете новое, даже если позже не пригодится это уж точно не тратить
вот линейки и вообще игрушки мморпг, вконтактики, однокласы - это именно трата времени и отупление себя
0
AckiyBolt
24.06.2013, 16:13
  #14

Не по теме:

Цитата Сообщение от verylazy Посмотреть сообщение
точно точно :) я не злорадствовал
у меня самого полно комплексов, к тому же я не программист, изучаю на уровне хобби (трачу время на java вместо того, что бы играть в lineage)
вот узнал про Jlist, будет что почитать вечером
молоток. че в нее играть? она с каждыми хронами все хуже и хуже(
эх С4... ностальжи
в этом году вроде линейдж этернал выходит. должно быть что-то интересное

Цитата Сообщение от mutagen Посмотреть сообщение
вот линейки и вообще игрушки мморпг, вконтактики, однокласы - это именно трата времени и отупление себя
мозги иногда тоже отдыхать должны. но иногда, а не всегда, тут да

0
любитель покушать
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
24.06.2013, 16:22 15
Цитата Сообщение от mutagen Посмотреть сообщение
Почему вы решили что это трата?

Не по теме:

я просто процитировал его, так то да, это не трата, я с вами согласен

0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
24.06.2013, 16:23 16
Ну, набросал модельный примерчик.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package ru.skipy.tests;
 
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
 
/**
 * PersonListTest
 *
 * @author Eugene Matyushkin aka Skipy
 * @since 24.06.13
 */
public class PersonListTest extends JFrame {
 
    public PersonListTest() {
        super("Person list rendering test");
        Person[] persons = new Person[]{
                new Person("Skipy", "+7-495-122-2222", "Moscow", BloodGroup.A, Resus.plus),
                new Person("trax", "+7-495-122-2223", "Moscow", BloodGroup.B, Resus.plus),
                new Person("Pjotar", "+7-812-122-2222", "Saint-Petersburg", BloodGroup.O, Resus.minus),
                new Person("Flanker", "+7-903-122-2222", "Ulyanovsk", BloodGroup.AB, Resus.plus),
                new Person("zoll", "+7-495-907-2222", "Moscow", BloodGroup.A, Resus.minus),
        };
        final JList<Person> list = new JList<>(persons);
        list.setCellRenderer(new PersonRenderer());
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting())
                    return;
                Person selected = list.getSelectedValue();
                System.out.println("Person selected: " + selected);
            }
        });
        JScrollPane sp = new JScrollPane(list);
        JPanel cp = new JPanel(new BorderLayout());
        cp.add(sp, BorderLayout.CENTER);
        setContentPane(cp);
        cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setSize(300,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
 
    public static void main(String[] args) {
        new PersonListTest().setVisible(true);
    }
 
    public static class PersonRenderer extends JPanel implements ListCellRenderer<Person> {
 
        private JLabel lblName;
        private JLabel lblPhone;
        private JLabel lblAddress;
        private JLabel lblBlood;
 
        public PersonRenderer() {
            super(new GridBagLayout());
            setOpaque(true);
            lblName = new JLabel();
            lblPhone = new JLabel();
            lblAddress = new JLabel();
            lblBlood = new JLabel();
            lblBlood.setHorizontalAlignment(JLabel.LEFT);
            Font f = lblName.getFont();
            Font fp = f.deriveFont(Font.PLAIN);
            lblName.setFont(f.deriveFont(Font.BOLD, 16));
            lblPhone.setFont(fp);
            lblAddress.setFont(fp);
            lblBlood.setFont(f.deriveFont(Font.BOLD, 18));
            add(lblName, new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.WEST,
                    GridBagConstraints.HORIZONTAL, new Insets(0, 0, 2, 2), 0, 0));
            add(lblPhone, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.WEST,
                    GridBagConstraints.HORIZONTAL, new Insets(0, 0, 2, 2), 0, 0));
            add(lblAddress, new GridBagConstraints(0, 2, 1, 1, 1, 0, GridBagConstraints.WEST,
                    GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 2), 0, 0));
            add(lblBlood, new GridBagConstraints(1, 0, 1, 3, 1, 0, GridBagConstraints.CENTER,
                    GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
            lblBlood.setPreferredSize(new Dimension(80,20));
        }
 
        @Override
        public Component getListCellRendererComponent(JList<? extends Person> jList, 
                                                      Person value, 
                                                      int index, 
                                                      boolean isSelected, 
                                                      boolean cellHasFocus) {
            setForeground(isSelected ? UIManager.getColor("List.selectionForeground") :
                    UIManager.getColor("List.foreground"));
            setBackground(isSelected ? UIManager.getColor("List.selectionBackground") :
                    UIManager.getColor("List.background"));
            setBorder(cellHasFocus ?
                    BorderFactory.createCompoundBorder(BorderFactory.createDashedBorder(
                            UIManager.getColor("List.foreground"), 1, 2),
                            BorderFactory.createEmptyBorder(1, 3, 1, 3)) :
                    BorderFactory.createEmptyBorder(2, 4, 2, 4));
            lblName.setText(value.name);
            lblAddress.setText(value.address);
            lblPhone.setText(value.phone);
            lblBlood.setText(value.bloodGroup.getTextRepresentation() + " " + 
                    value.resus.getTextRepresentation());
            return this;
        }
    }
 
    public static class Person {
 
        private String name;
        private String phone;
        private String address;
        private BloodGroup bloodGroup;
        private Resus resus;
 
        public Person(String name, String phone, String address, BloodGroup bloodGroup, Resus resus) {
            this.name = name;
            this.address = address;
            this.phone = phone;
            this.bloodGroup = bloodGroup;
            this.resus = resus;
        }
 
        @Override
        public String toString() {
            return "Person[" + name + "]";
        }
    }
 
    public static enum BloodGroup {
        O("I"), A("II"), B("III"), AB("IV");
 
        private String sign;
 
        BloodGroup(String sign) {
            this.sign = sign;
        }
 
        public String getTextRepresentation() {
            return name() + "(" + sign + ")";
        }
    }
 
    public static enum Resus {
 
        plus('+'), minus('-');
 
        private char sign;
 
        Resus(char sign) {
            this.sign = sign;
        }
 
        public String getTextRepresentation() {
            return "Rh" + sign;
        }
    }
}
1
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
25.06.2013, 23:31  [ТС] 17
Цитата Сообщение от Skipy Посмотреть сообщение
Слева JList с собственным ListCellRenderer-ом, который отрисовывает каждый элемент как Вам надо. По событию itemStateChanged с ItemState.SELECTED справа показывается вся информация.
прочитал Ваш пост:


Более-менее прояснил для себя этот вариант. Но осталась пара вопросов:
1. Если я правильно понял у CellRenderera должен быть метод painComponent(), через который я и буду рисовать свою "наглядность"? Собственно, я так понимаю, он не будет даже отличаться от моего painComponenta кнопки?

2. Если CellRenderer будет наследовать JLable, то чем это будет отличаться от того, что я например напихаю на панель просто вместо кнопок JLable? Может это и глупый вопрос, но я действительно не вкуриваю.

Добавлено через 4 минуты
а и еще
3. Вопрос из разряда "Для общего развития", Вы в статье перед конструктором Renderera ставили модификатор доступа public. Зачем? Просто хороший тон?
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
26.06.2013, 11:39 18
1. Нет. Там же был пример. Никакого paintComponent не надо реализовывать. Кроме того, я в этой же теме привел renderer, который отрисовывает панельку с информацией о пациенте.

2. Для того, чтобы разместить 1000 компонент на панели, надо расчитать предпочтительный размер каждой из них, потом применить раскладку, т.е. расчитать реальный размер каждой из них, в том числе и невидимых. Для того, чтобы отрисовать 1000 элементов, требуется только отрисовать те, которые находятся в области видимости. А их штук 5-10.

3. А как Вы создадите такой класс в другом пакете без public-конструктора?

Вы, судя по всему, не до конца понимаете, как работает renderer. Для того, чтобы отрисовать ячейку, делается следующее.

1. Вычисляется размер ячейки
2. renderer-у выставляется требуемый размер
3. Графический контекст Вашей компоненты копируется, у скопированного меняются координаты нулевой точки так, чтобы они были ровно в левом верхнем углу отрисовываемой ячейки
4. Вызывается метод paint (а не paintComponent!) renderer-а, в который передается настроенный графический контекст.
5. renderer отрисовывает себя (включая все свои дочерние элементы и рамки, что продемонстрировано в примере в этой теме) на указанном графическом контексте, т.е., фактически, в том месте, где находится ячейка.

Таким образом, вместо манипуляции с 1000 дочерними компонентами Вы их только отрисовываете. Причем отрисовка оптимизирована, потому невидимые элементы списка/таблицы/выпадающего списка/дерева/черта в ступе Вы не отрисовываете.
1
17 / 17 / 1
Регистрация: 28.03.2013
Сообщений: 80
27.06.2013, 20:18  [ТС] 19
Я прошу прощения, я просто не увидел, что вторая страница темы началась. Поэтому не видел Ваш пример здесь. Спасибо, теперь все понятно, думаю, когда напишу сам, разберусь до конца.
0
27.06.2013, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2013, 20:18
Помогаю со студенческими работами здесь

JPanel panel_south=new JPanel(); JTextArea textArea=new JTextArea(); Где ошибка?
JPanel panel_south=new JPanel(); JTextArea textArea=new JTextArea(); Label label=new JLabel('...

JPanel
Всем доброго времени суток. Есть программа(менюшка).В ней отображены 5 компонентов - 3...

JPanel
package com.gmail.kput4uk.frame; import java.awt.BorderLayout; import java.awt.Color; import...

Рисование на JPanel
Как нарисовать к примеру квадрат в JPanel, если панель создана в GUI Form? Пробовал разные способы...

Массив из JPanel
Скажите могу ли я заполнить массив таким образом и как мне его затем можно вставить в JFrame? ...

Не добавляется JPanel
public class DrawingPanel extends JPanel { public Color BrushColor; public Color...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru