Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java GUI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/27: Рейтинг темы: голосов - 27, средняя оценка - 4.81
Sonet
0 / 0 / 0
Регистрация: 21.03.2010
Сообщений: 46
1

Выпадающий список

08.02.2011, 16:53. Просмотров 5149. Ответов 4
Метки нет (Все метки)

Здравствйте. Начал писать небольшкю программку, необходимо выбрать из списка модель телефона и отобразить соответствующую картинку (это самое начало). Вот код:
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
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
 
import javax.swing.ComboBoxEditor;
import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPanel;
 
import sun.java2d.pipe.DrawImage;
 
 
public class app extends JApplet implements ItemListener{
    JComboBox cb;
    Image i = null;
    ArrayList models;
    InputStreamReader isr;
    BufferedReader br;
    FileInputStream fis;
    class Picture extends JPanel{
        public Picture(){
            setOpaque(false);
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(i!=null)
                g.drawImage(i,getWidth()/2-150,0,this);
        }
    }
    public void init(){
        try {
            cb = new JComboBox();
            fis=new FileInputStream("list.txt");
            isr = new InputStreamReader(fis);
            br= new BufferedReader(isr);
            models = new ArrayList();
            String line;
            while(true){
                line = br.readLine();
                if(line==null){
                    break;
                }
                models.add(line+".jpg");
            }
            Iterator it = models.iterator();
            while(it.hasNext()){
                cb.addItem((String)it.next());
            }
            JPanel controlPanel = new JPanel();
            controlPanel.setOpaque(false);
            controlPanel.add(cb);
            getContentPane().add(controlPanel, BorderLayout.NORTH);
            Picture pic = new Picture();
            getContentPane().add(pic, BorderLayout.CENTER);
            cb.addItemListener(this);
        }
        catch (FileNotFoundException e) {
        }
        catch (IOException e) {
        }
    }
    public void itemStateChanged(ItemEvent arg0) {
        i=getImage(getCodeBase(), (String)arg0.getItem());
    }
}
Вопрос вот в чем: изначально в выпадающем списвке выбран элемент (первый добавленный) и если используя список выбрать его же то ничего не происходит. Если же перед этим выбрать какой-либо другой жлемент, то все равботает нормально. Как это исправить?

И вдогонку вопрос: можно ли задавать ширину выпадающего списка вручную?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2011, 16:53
Ответы с готовыми решениями:

Java. Выпадающий список
Здравствуйте! Я новичок в Java, и у меня возникла проблема. У меня есть код, в...

код на выпадающий список compobox "шрифты" и " размер шрифта"
в выпадаюем списке шрифты системные должны быть, к сожалени нас учили только...

Как прочитать выпадающий список в Excel?
Доброго дня, может кто знает как прочитать выпадающий список в Excel?? Если...

Красивый выпадающий список JavaFX
Доброго времени суток Уважаемые форумчане. Собственно перейду к делу. Java...

В IE, кастомный выпадающий список: не выпадает список, если не хватает места снизу
Только в IE. не работает кастомный выпадающий список, если недостаточно места...

4
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
08.02.2011, 18:31 2
Цитата Сообщение от Sonet Посмотреть сообщение
Вопрос вот в чем: изначально в выпадающем списвке выбран элемент (первый добавленный) и если используя список выбрать его же то ничего не происходит. Если же перед этим выбрать какой-либо другой жлемент, то все равботает нормально. Как это исправить?
ЭТО Вы не исправите. Вы отслеживаете ИЗМЕНЕНИЕ состояния элемента. А оно не изменилось - какой был выделен, такой и остался.

Вам что надо? Чтобы для первого телефона картинка показывалась? setSelectedItem(null), addItemListener(this), setSelectedIndex(0) - в этом случае сработает слушатель.

И вдогонку вопрос: можно ли задавать ширину выпадающего списка вручную?
Малой кровью - нет. Можно сделать свой ComboBoxUI, унаследоваться, например, от javax.swing.plaf.basic.BasicComboBoxUI, тогда появится доступ к popup-компоненте. Но это Вы должны точно знать что делаете и чем рискуете.
0
Sonet
0 / 0 / 0
Регистрация: 21.03.2010
Сообщений: 46
09.02.2011, 18:04  [ТС] 3
Все что мне нужно было, это узнать о функции setSelectedItem, т.к. при старте апплета картинки отображаться не должно. Спасибо.

Добавлено через 23 часа 20 минут
Возникло несколько вопросов, по этой же задаче, но не связанных с названием топика.
Вот код:
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
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
 
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxEditor;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
 
import sun.java2d.pipe.DrawImage;
 
 
public class app extends JApplet implements ItemListener, ActionListener{
    JComboBox cb = new JComboBox();
    Image i = null;
    ArrayList models = new ArrayList();
    InputStreamReader isr;
    OutputStreamWriter osw;
    BufferedReader br;
    FileInputStream fis;
    FileOutputStream fos;
    JRadioButton jrb1 = new JRadioButton("Срочно");
    JRadioButton jrb2 = new JRadioButton("Не срочно");
    ButtonGroup bg = new ButtonGroup();
    JButton jb = new JButton("Заказать");
    GridLayout gr = new GridLayout();
    JLabel jl= new JLabel("Выберите модель из списка");
    String line;
    JPanel controlPanel = new JPanel();
    class Picture extends JPanel{
        public Picture(){
            setOpaque(false);
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(i!=null)
                g.drawImage(i,getWidth()/2-150,0,this);
        }
    }
    public void init(){
        try {
            setSize(600, 650);
            fos = new FileOutputStream("1.txt");
            fis=new FileInputStream("list.txt");
            isr = new InputStreamReader(fis);
            osw = new OutputStreamWriter(fos);
            br= new BufferedReader(isr);
            gr.setRows(2);
            bg.add(jrb1);
            bg.add(jrb2);
            while(true){
                line = br.readLine();
                if(line==null){
                    break;
                }
                models.add(line);
            }
            Iterator it = models.iterator();
            while(it.hasNext()){
                cb.addItem((String)it.next());
            }
            controlPanel.setOpaque(false);
            controlPanel.setLayout(gr);
            controlPanel.add(jl);
            controlPanel.add(jb);
            cb.setSelectedItem(null);
            getContentPane().add(cb, BorderLayout.NORTH);
            Picture pic = new Picture();
            getContentPane().add(pic, BorderLayout.CENTER);
            getContentPane().add(jrb1,BorderLayout.EAST);
            getContentPane().add(jrb2,BorderLayout.WEST);
            getContentPane().add(controlPanel, BorderLayout.SOUTH);
            cb.addItemListener(this);
            jb.addActionListener(this);
            line=null;
        }
        catch (FileNotFoundException e) {
        }
        catch (IOException e) {
        }
    }
    public void itemStateChanged(ItemEvent e) {
        if(e.getItemSelectable() == cb){
            i=getImage(getCodeBase(), (String)e.getItem()+".jpg");
            line=(String)e.getItem();
            repaint();
        }
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==jb){
            try{
                if(line!=null && jrb1.isSelected()){
                    osw.write(line+" срочно\n");
                    jrb1.setSelected(false);
                    cb.setSelectedItem(null);
                    i=null;
                    jl.setText("Вы заказали модель "+line);
                    line=null;
                    repaint();
                }
                else if(line!=null && jrb2.isSelected()){
                    osw.write(line+" не срочно\n");
                    jrb2.setSelected(false);
                    cb.setSelectedItem(null);
                    i=null;
                    jl.setText("Вы заказали модель "+line);
                    line=null;
                    repaint();
                }
                else if(line==null){
                    jl.setText("Не выбрана модель из списка");
                }
                else if(line!=null && !jrb1.isSelected() && !jrb2.isSelected()){
                    jl.setText("Укажите тип заказа");
                }
            }
            catch (FileNotFoundException ie) {
            }
            catch (IOException ie) {
            }
        }
    }
    public void destroy(){
        try {
            osw.close();
        } catch (IOException e) {
        }
    }
    
}
Вопросы следующие:
1) jrb2.setSelected(false); и jrb1.setSelected(false); не устанавливают соответствующие значения кнопок, тобишь флажок, который был выбран до генерации соответствующего события остается выбранным и после его обработки.
2) Для ControlPanel выбрал менеджер GridLayout с 2 строками, в первой строке находится объект Jlabel, как сделать так чтобы он находился по центро строки?
3) Как запретить изменять размер окна (апплета, не заню как верно сказать)?
0
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
09.02.2011, 18:50 4
Цитата Сообщение от Sonet Посмотреть сообщение
Вопросы следующие:
1) jrb2.setSelected(false); и jrb1.setSelected(false); не устанавливают соответствующие значения кнопок, тобишь флажок, который был выбран до генерации соответствующего события остается выбранным и после его обработки.
А как Вы себе это представляете с radio-кнопками, объединенными в группу? Вы убираете выделение. Какая из оставшихся кнопок должна выделиться? Хотите снять выделение со всех кнопок группы - так и пляшите от группы! bg.clearSelection();

2) Для ControlPanel выбрал менеджер GridLayout с 2 строками, в первой строке находится объект Jlabel, как сделать так чтобы он находился по центро строки?
Для начала почитать про GridLayout и понять, что Label занимает всю область: . Затем покопаться в API самой метки и найти, как у нее центрируется текст: http://download.oracle.com/javase/6/...Alignment(int) (jl.setHorizontalAlignment(SwingConstants.CENTER))

3) Как запретить изменять размер окна (апплета, не заню как верно сказать)?
Размер апплета задается в HTML и средств для его изменения кроме как через JavaScript нет.
1
Sonet
0 / 0 / 0
Регистрация: 21.03.2010
Сообщений: 46
10.02.2011, 16:33  [ТС] 5
Дошел до завершающей стадии
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
public class app extends JApplet implements ItemListener, ActionListener{
    JComboBox cb = new JComboBox();
    Image i = null;
    Picture pic = new Picture();
    ArrayList models = new ArrayList();
    InputStreamReader isr;
    InputStreamReader isr2;
    OutputStreamWriter osw;
    BufferedReader br;
    BufferedReader br2;
    FileInputStream fis;
    FileInputStream fis2;
    FileOutputStream fos;
    JRadioButton jrb1 = new JRadioButton("Срочно");
    JRadioButton jrb2 = new JRadioButton("Не срочно");
    ButtonGroup bg = new ButtonGroup();
    JButton jb = new JButton("Заказать");
    JButton jb1 = new JButton("Подобрать");
    GridLayout gr = new GridLayout();
    JLabel jl= new JLabel("Выберите модель из списка");
    JLabel jl1 = new JLabel();
    String line, list, status;
    int maxCount;
    Phone temp;
    JTextField jt = new JTextField(15);
    JPanel controlPanel = new JPanel();
    JPanel controlPanel1 = new JPanel();
    Iterator it;
    class Phone{
        public int count;
        public int price;
        public String name;
        public Phone(String name, int price){
            this.name=name;
            this.price=price;
        }
    }
    class Picture extends JPanel{
        public Picture(){
            setOpaque(false);
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(i!=null){
                jl1.setText(null);
                g.drawImage(i,getWidth()/2-150,0,this);
            }
 
        }
    }
    public void init(){
        try {
            setSize(600, 650);
            fos = new FileOutputStream("1.txt");
            fis = new FileInputStream("list.txt");
            fis2 = new FileInputStream("price.txt");
            isr = new InputStreamReader(fis);
            isr2 = new InputStreamReader(fis2);
            osw = new OutputStreamWriter(fos);
            br = new BufferedReader(isr);
            br2 = new BufferedReader(isr2);
            while(true){
                line = br.readLine();
                if(line==null){
                    break;
                }
                models.add(new Phone(line,Integer.parseInt(br2.readLine())));
            }
            it = models.iterator();
            while(it.hasNext()){
                cb.addItem(((Phone)it.next()).name);
            }
            bg.add(jrb1);
            bg.add(jrb2);
            gr.setRows(2);
            jl.setHorizontalAlignment(SwingConstants.CENTER);
            jt.setText("Введите цену");
            cb.setSelectedItem(null);
            controlPanel.setOpaque(false);
            controlPanel.setLayout(gr);
            controlPanel.add(jl);
            controlPanel.add(jb);
            controlPanel1.setOpaque(false);
            controlPanel1.setLayout(new FlowLayout());
            controlPanel1.add(cb);
            controlPanel1.add(jt);
            controlPanel1.add(jb1);
            getContentPane().add(controlPanel1, BorderLayout.NORTH);
            pic.add(jl1);
            getContentPane().add(pic, BorderLayout.CENTER);
            getContentPane().add(jrb1,BorderLayout.EAST);
            getContentPane().add(jrb2,BorderLayout.WEST);
            getContentPane().add(controlPanel, BorderLayout.SOUTH);
            cb.addItemListener(this);
            jb.addActionListener(this);
            jb1.addActionListener(this);
            line=null;
        }
        catch (FileNotFoundException e) {
        }
        catch (IOException e) {
        }
    }
    public void itemStateChanged(ItemEvent e) {
        if(e.getItemSelectable() == cb){
            i=getImage(getCodeBase(), (String)e.getItem()+".jpg");
            line=(String)e.getItem();
            list = null;
            repaint();
        }
    }
    public void actionPerformed(ActionEvent e) {
        try{
            if(e.getSource()==jb){
                    if(line!=null && jrb1.isSelected()){
                        osw.write(line+" срочно\n");
                        cb.setSelectedItem(null);
                        bg.clearSelection();
                        i=null;
                        jl.setText("Вы заказали модель "+line);
                        it=models.iterator();
                        while(it.hasNext()){
                            temp=(Phone)it.next();
                            if(temp.name.equals(line)){
                                temp.count++;
                            }
                            if(temp.count>=maxCount){
                                maxCount=temp.count;
                            }
                            break;
                        }
                        line=null;
                        status();
                        repaint();
                    }
                    else if(line!=null && jrb2.isSelected()){
                        osw.write(line+" не срочно\n");
                        cb.setSelectedItem(null);
                        bg.clearSelection();
                        i=null;
                        jl.setText("Вы заказали модель "+line);
                        it=models.iterator();
                        while(it.hasNext()){
                            temp=(Phone)it.next();
                            if(temp.name.equals(line)){
                                temp.count++;
                            }
                            if(temp.count>=maxCount){
                                maxCount=temp.count;
                            }
                            break;
                        }
                        line=null;
                        status();
                        repaint();
                    }
                    else if(line==null){
                        jl.setText("Не выбрана модель из списка");
                    }
                    else if(line!=null && !jrb1.isSelected() && !jrb2.isSelected()){
                        jl.setText("Укажите тип заказа");
                    }
                }
                
            else if(e.getSource()==jb1){
                int n;
                list = null;
                if(jt.getText()==null){
                    return;
                }
                n = Integer.parseInt(jt.getText());
                jt.setText(null);
                it=models.iterator();
                while(it.hasNext()){
                    temp=(Phone)it.next();
                    if(temp.price>=n){
                        if(list==null)  
                            list="Найденные модели: ";
                            list=list+"----"+temp.name;
                    }
                }
                if(list==null){
                    list="Моделей с ценой больше заданной не найдено";
                }
                i=null;
                line=null;
                cb.setSelectedItem(null);
                bg.clearSelection();
                jl.setText("Выберите модель из списка");
                repaint();
                jl1.setText(list);
            }
        }
        catch (FileNotFoundException ie) {
        }
        catch (IOException ie) {
        }
        catch (NumberFormatException ie){
            
        }
    }
    public void status(){
        it=models.iterator();
        status=null;
        while(it.hasNext()){
            temp=(Phone)it.next();
            if(temp.count==maxCount){
                if(status==null){
                    status="Популярные модели: ";
                }
                status=status+temp.name+"  ";
            }
        }
        showStatus(status);
    }
    public void destroy(){
        try {
            osw.close();
        } catch (IOException e) {
        }
    }
    
}
В общем есть 2 проблемы:
1) ф-ия status обновляет статус ровно 1 раз, далее даже. если какой-то из элементов списка models имеет count больше чем значение maxCount, статус не изменится.
2) Неправильно отлавливается нажатие кнопки jb1, а именно: при первом нажатии на нее с корректно заданным текстом в поле jt (тобишь вписано число) jl1 не отображается что ли, но при этом остается нарисованной картинка, сбрасываются радиокнопки, выбранный элемент выпадающего списка в общем все переменные которые должны сбрасываться при нажатии на нее. Лишь при следующем вводе числа в текстовое поле, картинка пропадает и отображается jl1.

Вторую проблему исправил перестановкой jl1.setText(list); перед line=null; и i=null; после repaint();

Добавлено через 15 минут
Первую решил сам, т.к там ошибка была алгоритмическая. А вот во втрой не понятно почему все работало как надо только при выставлении операции именно в таком порядке, как я указал ранее.
0
10.02.2011, 16:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 16:33

выпадающий список
нужно сделать выпадающий список <?php echo "<select name=year>"; echo...

Выпадающий список
Здравствуйте! Каким образом можно ограничить выбор значений атрибута отношения...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru