Как я могу сделать этот список элементов для JRadioButton

#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. Спасибо. Я буду иметь это в виду и постараюсь сделать так, как вы предложили. Большое вам спасибо.