#java #swing
#java #качать
Вопрос:
Я пытаюсь использовать sizeP для массива. Сделайте итоговый счет равным (выбранному элементу массива) из margheritaPizza. Но это вообще не меняет значения. Как будто слушатель не делает ничего хорошего.
Что-то не так в моем списке элементов или в коде в целом? Подойдет любая помощь. Я всего лишь 3-й курс колледжа, и у меня проблемы с этим, потому что я самоучка.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class tryyy extends JFrame implements ItemListener{
final int [] margheritaPizza = {258, 450, 799, 999};
int totalBill = 0, sizeP = 0;
ButtonGroup pType = new ButtonGroup();
JRadioButton mPizza = new JRadioButton("Margherita Pizza");
ButtonGroup pSize = new ButtonGroup();
JRadioButton small = new JRadioButton("Small");
JRadioButton medium = new JRadioButton("Medium");
JRadioButton large = new JRadioButton("Large");
JRadioButton xl = new JRadioButton("Extra Large");
JLabel pizzaTypes = new JLabel ("Pizza Types");
JLabel sizes = new JLabel ("Sizes ");
JTextField totBill = new JTextField (5);
JPanel mainPanel = new JPanel();
JPanel pTypePanel = new JPanel();
JPanel pSizePanel = new JPanel();
JPanel sizePanel = new JPanel();
public tryyy(){
super ("PIZZA MENU");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(mainPanel);
add(pTypePanel);
add(sizePanel);
add(pSizePanel);
setLayout (new FlowLayout (FlowLayout.LEFT));
mainPanel.add(pizzaTypes);
pType.add(mPizza);
sizePanel.add(sizes);
pSize.add(small);
pSize.add(medium);
pSize.add(large);
pSize.add(xl);
pSizePanel.add(small);
pSizePanel.add(medium);
pSizePanel.add(large);
pSizePanel.add(xl);
add(totBill);
totBill.setText("$" margheritaPizza[sizeP]);
totBill.setEnabled(true);
small.addItemListener(this);
medium.addItemListener(this);
large.addItemListener(this);
xl.addItemListener(this);
mainPanel.setLayout(new GridLayout(0,2));
pTypePanel.setLayout(new GridLayout(0,3));
pSizePanel.setLayout(new GridLayout(0,4));
sizePanel.setLayout(new GridLayout(1,0));
small.setSelected(true);
}
public static void main(String[] args) {
tryyy aFrame = new tryyy();
aFrame.setSize(325,500);
aFrame.setVisible(true);
}
@Override
public void itemStateChanged(ItemEvent e) {
Object source = e.getSource();
int select = e.getStateChange();
if(source == small)
if (select == ItemEvent.SELECTED)
sizeP = 0;
else if (source == medium)
if (select == ItemEvent.SELECTED)
sizeP = 1;
else if (source == large)
if (select == ItemEvent.SELECTED)
sizeP = 2;
else
if (select == ItemEvent.SELECTED)
sizeP = 3;
}
}
Ответ №1:
Ваш код немного запутан, но ваша конкретная проблема возникает из-за того, что вы не меняете текст totBill при возникновении событий кнопки. Попробуйте это.
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED){
Object source = e.getSource();
if(source == small){
sizeP = 0;
} else if (source == medium) {
sizeP = 1;
}else if (source == large) {
sizeP = 2;
}else {
sizeP = 3;
}
totBill.setText("$" margheritaPizza[sizeP]);
}
}
Комментарии:
1. Спасибо. Я попробую это позже и надеюсь, что это решит проблему. Большое вам спасибо
Ответ №2:
Несколько вещей, которые следует учитывать:
- Вы не переназначаете правильный текст
JTextField
в свойItemListener
. Вы только меняетеpSize
, но это не повлияет на отображаемое текстовое поле. - Всегда используйте фигурные скобки, потому что в противном случае вы столкнетесь с поведением, которое может быть неожиданным. (В данном случае, в ваших if-блоках)
- Имена классов начинаются с прописных букв.
- Возможно, вы захотите пересмотреть свой макет, потому что сейчас он довольно грязный. В конце концов, вы не должны использовать фиксированные размеры для своих компонентов и позволить менеджеру компоновки выполнить всю работу за вас. (Возможно, ознакомьтесь с руководством по использованию менеджеров компоновки)
- Для выбора «Пиццы», возможно
JComboBox
, больше подходит, если их будет больше. - Может быть, вам больше подходит использовать
ActionListener
в сочетании сsetActionCommand()
методом на ваших переключателях. (Но это, вероятно, основано на мнении и будет зависеть от вашего дальнейшего варианта использования)
Смотрите Пример ниже:
public class Try extends JFrame implements ActionListener {
....
....
small.setActionCommand("$" margheritaPizza[0]);
small.addActionListener(this);
medium.setActionCommand("$" margheritaPizza[1]);
medium.addActionListener(this);
large.setActionCommand("$" margheritaPizza[2]);
large.addActionListener(this);
xl.setActionCommand("$" margheritaPizza[3]);
xl.addActionListener(this);
.....
@Override
public void actionPerformed(ActionEvent e) {
totBill.setText(e.getActionCommand());
}
Комментарии:
1. Спасибо. Я буду иметь это в виду и постараюсь сделать так, как вы предложили. Большое вам спасибо.