Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 14

Выбор элемента интерфейса

25.12.2012, 10:42. Показов 1851. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Подскажите, с помощью каких элементов интерфейса из библиотеки swing можно реализовать выбор элементов (на подобии того, что использует сайт vk.com при создании чата).


Кликните здесь для просмотра всего текста

Вверху строка для выбора участников, при нажатии на которую появляется выпадающий список.
См. ниже

Кликните здесь для просмотра всего текста

Тут используется выпадающий список, тут вроде всё понятно.

Кликните здесь для просмотра всего текста

При выборе человека он отображается в строке, а при нажатии на эту строку можно выбирать ещё собеседников.

Как можно создать похожий интерфейс на java + swing? Сам процесс отправки сообщений мне не важен, интересует отображение нескольких элементов в строке (видимо, в каких-то блоках) с возможностью их удаления и выбора новых.

Может быть кто-то сталкивался с этим.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2012, 10:42
Ответы с готовыми решениями:

Выбор языка интерфейса программы
Всем привет Хочу реализовать свою программу на нескольких языках (Рус и Каз) Как и Что для этого потребуется, в голову не...

Выбор дизайнера для создания графического интерфейса
Здравствуйте! Что лучше выбрать при разработке интерефейсов? Т.е. какой дизайнер. Попробовал руками добавлять компоненты, это очень...

Выбор интерфейса
Имеем: http://catalog.onliner.by/msi/n670pe2gd5oc/ http://catalog.onliner.by/msi/z77ag43/ Какой монитор брать(интерфейс какой?(DVI...

8
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
25.12.2012, 19:20
Непонятно про "можно выбирать еще собеседников". Вы хотите несколько человек из этого списка выбрать? Как они тогда должны отображаться в интерфейсе?
1
2 / 2 / 2
Регистрация: 01.10.2012
Сообщений: 91
25.12.2012, 20:06
интересует отображение нескольких элементов в строке (видимо, в каких-то блоках) с возможностью их удаления и выбора новых.
Если я понял, о чем идет речь, то нужно использовать класс (далее я буду называть его NewButton), пронаследованный от JButton, объекты этого класса лепить на небольшую JPanel, на которой будет стоять FlowLayout. Прописать в классе NewButton, чтобы при нажатие на них они удалялись и компоновщик панельки переставлял объекты. Отдельно лепится обычная кнопка (На картинке это кнопка Add), лучше лепить её первой. При нажатии на кнопку лучше всего будет сделать появление нового фрейма со списком людей. (Ну или просто на этой панели сделать невидимым все, кроме панели с выбором, а после выбора сделать видимым все, кроме панели выбора. Тут вам самим решать)
1
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 14
26.12.2012, 10:46  [ТС]
Skipy, принцип таков. Есть какое-то задание, нужно это задание закрепить за сотрудниками. Менеджер нажимает на строку и появляется раскрывающийся список всех сотрудников предприятия (как на картинке 2).
Менеджер в этом списке выбирает, допустим, Сергея, Василия и Михаила (т.е. несколько человек, как на картинке 3) и нажимает "готово". Теперь за заданием закреплены три человека - Михаил, Василий и Сергей.
Вы хотите несколько человек из этого списка выбрать?
Да, как одного, так и нескольких.
Как они тогда должны отображаться в интерфейсе?
Примерно на картинке 3.

Kamit, да, Вы достаточно верно поняли. Я думал может быть есть такие или похожие компоненты в библиотеках где-нибудь, но так и не нашёл. Видимо придётся действительно самому писать.

Skipy, Kamit, спасибо за вопросы и интерес к теме.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
26.12.2012, 16:03
Я бы сказал, что это тогда не JComboBox, а собственную компоненту надо писать...

А зачем, кстати, выпадающий список? Почему не всплывающее окно? Намного проще будет...
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
26.12.2012, 17:49
Ну вот где-то так получается...

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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package ru.skipy.tests.swing;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.Array;
import java.util.*;
import java.util.List;
 
/**
 * MultipleSelectionComponentTest
 *
 * @author Eugene Matyushkin aka Skipy
 * @since 26.12.12
 */
public class MultipleSelectionComponentTest extends JFrame {
 
    MultipleSelectionComponentTest() {
        super("Multiple selection component test");
        JPanel cp = new JPanel(new BorderLayout());
        cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setContentPane(cp);
        cp.add(new MultipleSelectionComponent<>(new ElementListSourceImpl(), ElementImpl.class), BorderLayout.NORTH);
        setSize(600, 300);
        JButton close = new JButton("Close");
        close.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel bp = new JPanel(new FlowLayout(FlowLayout.CENTER));
        bp.add(close);
        cp.add(bp, BorderLayout.SOUTH);
        setLocationRelativeTo(null);
    }
 
 
    public static void main(String[] args) {
        new MultipleSelectionComponentTest().setVisible(true);
    }
 
}
 
class ElementListSourceImpl implements ElementListSource<ElementImpl> {
 
    private java.util.List<ElementImpl> elements;
 
    public ElementListSourceImpl() {
        elements = new ArrayList<>();
        elements.add(new ElementImpl("ya_paul"));
        elements.add(new ElementImpl("Skipy"));
        elements.add(new ElementImpl("kamit"));
        elements.add(new ElementImpl("mutagen"));
        elements.add(new ElementImpl("turbanoff"));
        elements.add(new ElementImpl("Drygba"));
        elements.add(new ElementImpl("exiga"));
        elements.add(new ElementImpl("Vortal"));
        elements.add(new ElementImpl("MILAN"));
        elements.add(new ElementImpl("lemegeton"));
    }
 
    @Override
    public List<ElementImpl> getElements() {
        return elements;
    }
}
 
class ElementImpl implements SelectableElement {
 
    private String name;
 
    public ElementImpl(String name) {
        this.name = name;
    }
 
    @Override
    public String getElementDescription() {
        return name;
    }
 
    @Override
    public Image getElementImage() {
        return null;
    }
 
    @Override
    public int hashCode() {
        return name.hashCode();
    }
 
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof ElementImpl))
            return false;
        ElementImpl ei = (ElementImpl) obj;
        return name.equals(ei.name);
    }
}
 
class MultipleSelectionComponent<Element extends SelectableElement> extends JPanel implements ActionListener {
 
    private JPanel elementsPanel;
 
    private Set<Element> elements;
 
    private ElementListSource<Element> els;
    private Class<Element> cls;
 
    public MultipleSelectionComponent(ElementListSource<Element> els, Class<Element> cls) {
        super(new BorderLayout(3, 3));
        this.els = els;
        this.cls = cls;
        JButton addElementsButton = new JButton();
        addElementsButton.setIcon(new ImageIcon(getClass().getResource("/images/add.png")));
        add(addElementsButton, BorderLayout.LINE_END);
        elementsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
        add(elementsPanel, BorderLayout.CENTER);
        setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.darkGray, 1),
                BorderFactory.createEmptyBorder(3, 3, 3, 3)));
        addElementsButton.addActionListener(this);
        elements = new HashSet<>();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        ElementSelector<Element> es = new ElementSelector<>(els, cls);
        int result = JOptionPane.showInternalConfirmDialog(this, es, "Select elements",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
        if (result == JOptionPane.OK_OPTION) {
            java.util.List<Element> elts = es.getSelectedElements();
            if (elts != null) {
                for (Element elt : elts) {
                    if (!elements.contains(elt)) {
                        elements.add(elt);
                        elementsPanel.add(new ElementPanel(elt));
                    }
                }
            }
        }
    }
 
    class ElementPanel extends JPanel {
 
        Element element;
 
        ElementPanel(Element element) {
            super(new BorderLayout(2, 2));
            this.element = element;
            setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(),
                    BorderFactory.createEmptyBorder(2, 2, 2, 2)));
            JLabel delete = new JLabel(new ImageIcon(getClass().getResource("/images/delete.png")));
            add(delete, BorderLayout.LINE_END);
            delete.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    elements.remove(ElementPanel.this.element);
                    elementsPanel.remove(ElementPanel.this);
                    elementsPanel.repaint();
                }
            });
            JLabel lbl = new JLabel(element.getElementDescription());
            if (element.getElementImage() != null) {
                lbl.setIcon(new ImageIcon(element.getElementImage()));
            }
            add(lbl, BorderLayout.LINE_START);
        }
    }
 
}
 
class ElementPanelRenderer<Element extends SelectableElement> extends JLabel implements ListCellRenderer<Element> {
 
    public ElementPanelRenderer() {
        setOpaque(true);
    }
 
    @Override
    public Component getListCellRendererComponent(JList<? extends Element> jList, Element value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.getElementDescription());
        if (value.getElementImage() != null) {
            setIcon(new ImageIcon(value.getElementImage()));
        }
        setBackground(isSelected ? SystemColor.textHighlight : SystemColor.window);
        setBorder(cellHasFocus ? BorderFactory.createStrokeBorder(
                new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND, 1, new float[]{1, 1}, 1)) : null);
        return this;
    }
}
 
class ElementSelector<Element extends SelectableElement> extends JPanel {
 
    private JList<Element> elementsList;
 
    public ElementSelector(ElementListSource<Element> els, Class<Element> cls) {
        super(new BorderLayout());
        java.util.List<Element> elts = els.getElements();
        elementsList = new JList<>(elts.toArray((Element[]) Array.newInstance(cls, elts.size())));
        elementsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        elementsList.setCellRenderer(new ElementPanelRenderer<Element>());
        add(new JScrollPane(elementsList), BorderLayout.CENTER);
    }
 
    public java.util.List<Element> getSelectedElements() {
        return elementsList.getSelectedValuesList();
    }
}
 
interface ElementListSource<Element extends SelectableElement> {
 
    public java.util.List<Element> getElements();
 
}
 
interface SelectableElement {
 
    public String getElementDescription();
 
    public Image getElementImage();
 
}
Надо добавить к коду ресурсы - картинку "добавить" (/images/add.png) и "удалить" (/images/remove.png), я их тоже прикрепил

Ну и, собственно, всё. Всплывающее окно получает имена из источника, который можно реализовать как угодно, и передает выбранные элементы в список. Он там сделан на FlowLayout, так что не все вставленные компоненты могут быть видны, но это тоже легко исправляется.
Изображения
  
1
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
26.12.2012, 17:56
Блин, задолбали менять правила изменения сообщений. Через пять минут уже исправление в код внести нельзя

В общем, вот так.

Раз:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    @Override
    public void actionPerformed(ActionEvent e) {
        ElementSelector<Element> es = new ElementSelector<>(els, cls);
        int result = JOptionPane.showConfirmDialog(this, es, "Select elements",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
        if (result == JOptionPane.OK_OPTION) {
            java.util.List<Element> elts = es.getSelectedElements();
            if (elts != null) {
                for (Element elt : elts) {
                    if (!elements.contains(elt)) {
                        elements.add(elt);
                        elementsPanel.add(new ElementPanel(elt));
                    }
                }
            }
            doLayout();
            validate();
        }
    }
Два:

Java
1
2
3
4
5
6
                public void mouseClicked(MouseEvent e) {
                    elements.remove(ElementPanel.this.element);
                    elementsPanel.remove(ElementPanel.this);
                    elementsPanel.doLayout();
                    elementsPanel.repaint();
                }
1
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 14
26.12.2012, 18:54  [ТС]
Skipy, спасибо огромное!
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
29.12.2012, 13:18
Цитата Сообщение от Skipy Посмотреть сообщение
Блин, задолбали менять правила изменения сообщений. Через пять минут уже исправление в код внести нельзя
да мне тож не нравится, на мой взгляд правильно пока снизу не допостили, меняй сколько хош, но мише виднее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2012, 13:18
Помогаю со студенческими работами здесь

Выбор интерфейса
Здравствуйте. Возможно вопрос пустячный, но не для нуба. Интересует предпочтительный вариант подключения монитора (21,5&quot; HP 22w) к...

Выбор сетевого интерфейса
Добрый день. Появилась необходимость написать скрипт для настройки сети. Так как все компы имеют статические параметры подключения, а...

Выбор СУБД для web интерфейса
Добрый день! На работе необходимо сделать интерфейс к базе данных на WEB. База данных уже создана, но не заполнена. И дело в том, что...

Расположение элемента интерфейса
Как в разметке указать, что элемент должен располагаться следующим образом: верхний край элемента на 200dp ниже верхнего края...

Выбор инструмента для создания графического интерфейса БД на Java
Добрый день! У меня возник вопрос: существует БД,которая была создана на Oracle Database. В ней присутствуют таблицы итд. Я хотел бы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru