Как добавить цены на товары в поле со списком? - PullRequest
0 голосов
/ 22 марта 2020

Мне нужно создать простое приложение GUI с использованием Swing в Eclipse. Я решил, что хочу создать простое приложение службы проката автомобилей.

Я не очень уверен, как привязать цены к моделям автомобилей и дням, которые указаны в двух отдельных полях со списком. Я также не очень уверен, как сделать так, чтобы комбинированная цена модели автомобиля и дня отображалась в текстовом поле после нажатия кнопки проката.

Ниже приведена фотография моего GUI, чтобы вы ребята видят с чем я работаю. Я также добавил свой код, который у меня есть.

Изображение моего GUI

private JLabel l0 = new JLabel("  Car  Rental  ");
    private JLabel l1 = new JLabel("Name ");
    private JTextField t1=new JTextField(" ",8);
    private JLabel l2 = new JLabel("Email ");
    private JTextField t2=new JTextField(" ",8);
    private JLabel l3 = new JLabel("Phone Number ");
    private JTextField t3=new JTextField("0",8);
    private JLabel l4 = new JLabel("Car Model ");
    private String [] models={"BMW","Mercedes","Audi"};
    private JComboBox c1=new JComboBox(models);
    private JLabel l5 = new JLabel("Days ");
    private String [] days={"1","2","3","4","5","6","7"};
    private JComboBox c2=new JComboBox(days);
    private JButton b1=new JButton("Hire");
    private JTextField t4=new JTextField("0",8);
    private JButton b2=new JButton("Print Receipt"); 
    private JButton b3=new JButton("Exit");
    private JPanel p1=new JPanel();

    public MyFrame2(String s){
        super(s);
        Container content=getContentPane();
        content.setLayout(new FlowLayout());
        Font f=new Font("TimesRoman", Font.BOLD,20);
        p1.setLayout(new GridLayout(7,2));
        l0.setFont(f);  l1.setFont(f);

        content.add(l0);

        p1.add(l1); p1.add(t1);
        p1.add(l2); p1.add(t2);
        p1.add(l3); p1.add(t3);
        p1.add(l4); p1.add(c1);
        p1.add(l5); p1.add(c2);
        p1.add(b1); p1.add(t4);
        p1.add(b2); p1.add(b3);


        content.add(p1);

        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        setSize(270,320);    setVisible(true);}

    public void actionPerformed(ActionEvent e){

        Object target=e.getSource();

        if (target==b1)

        if (target==b2){
            System.out.println("====Receipt====");
            System.out.println("Name: " + t1.getText());
            System.out.println("Phone Number: " + t3.getText());
            System.out.println("Car Model: " + c1.getSelectedItem());
            System.out.println("Days: " + c2.getSelectedItem());}

        if (target==b3) {
            System.exit(1);}


                 }
    }

1 Ответ

1 голос
/ 22 марта 2020

Код ниже должен помочь вам начать. Это неполно, поскольку я не нашел все требования в вашем вопросе.

Пояснения после кода.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.math.BigDecimal;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class CarsHire implements ActionListener, Runnable {
    private JButton exitButton;
    private JButton hireButton;
    private JButton receiptButton;
    private JComboBox<Car> carModelsCombo;
    private JComboBox<Integer> daysCombo;
    private JFrame frame;
    private JTextField emailTextField;
    private JTextField nameTextField;
    private JTextField phoneTextField;
    private JTextField priceTextField;

    @Override // java.awt.event.ActionListener
    public void actionPerformed(ActionEvent event) {
        Object src = event.getSource();
        if (exitButton == src) {
            System.exit(0);
        }
        else if (hireButton == src) {
            displayPrice();
        }
        else if (receiptButton == src) {
            System.out.println("====Receipt====");
            System.out.println("Name: " + t1.getText());
            System.out.println("Phone Number: " + t3.getText());
            System.out.println("Car Model: " + c1.getSelectedItem());
            System.out.println("Days: " + c2.getSelectedItem());
        }
    }

    @Override // java.lang.Runnable
    public void run() {
        createAndShowGui();
    }

    private void createAndShowGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createHeaderPanel(), BorderLayout.PAGE_START);
        frame.add(createMainPanel(), BorderLayout.CENTER);
        frame.add(createButtonsPanel(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtonsPanel() {
        JPanel buttonsPanel = new JPanel();
        receiptButton = new JButton("Print Receipt");
        receiptButton.setMnemonic(KeyEvent.VK_R);
        receiptButton.addActionListener(this);
        buttonsPanel.add(receiptButton);

        exitButton = new JButton("Exit");
        exitButton.setMnemonic(KeyEvent.VK_X);
        exitButton.addActionListener(this);
        buttonsPanel.add(exitButton);

        exitButton.setPreferredSize(receiptButton.getPreferredSize());

        return buttonsPanel;
    }

    private JPanel createHeaderPanel() {
        JPanel headerPanel = new JPanel();
        JLabel headerLabel = new JLabel("Car Rental");
        Font f = new Font("TimesRoman", Font.BOLD, 20);
        headerLabel.setFont(f);
        headerPanel.add(headerLabel);
        return headerPanel;
    }

    private JPanel createMainPanel() {
        JPanel mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets.bottom = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;
        gbc.insets.top = 5;
        gbc.anchor = GridBagConstraints.LINE_START;

        // First row of form.
        JLabel nameLabel = new JLabel("Name");
        nameLabel.setDisplayedMnemonic(KeyEvent.VK_N);
        mainPanel.add(nameLabel, gbc);
        gbc.gridx = 1;
        nameTextField = new JTextField(10);
        mainPanel.add(nameTextField, gbc);
        nameLabel.setLabelFor(nameTextField);

        // Second row of form.
        gbc.gridx = 0;
        gbc.gridy = 1;
        JLabel emailLabel = new JLabel("Email");
        emailLabel.setDisplayedMnemonic(KeyEvent.VK_E);
        mainPanel.add(emailLabel, gbc);
        gbc.gridx = 1;
        emailTextField = new JTextField(10);
        mainPanel.add(emailTextField, gbc);
        emailLabel.setLabelFor(emailTextField);

        gbc.gridx = 0;
        gbc.gridy = 2;
        JLabel phoneLabel = new JLabel("Phone Number");
        phoneLabel.setDisplayedMnemonic(KeyEvent.VK_P);
        mainPanel.add(phoneLabel, gbc);
        gbc.gridx = 1;
        phoneTextField = new JTextField(10);
        mainPanel.add(phoneTextField, gbc);
        phoneLabel.setLabelFor(phoneTextField);

        gbc.gridx = 0;
        gbc.gridy = 3;
        JLabel carModelLabel = new JLabel("Car Model");
        carModelLabel.setDisplayedMnemonic(KeyEvent.VK_M);
        mainPanel.add(carModelLabel, gbc);
        gbc.gridx = 1;
        Car[] carModels = new Car[]{new Car("BMW", new BigDecimal(36295)),
                                    new Car("Mercedes", new BigDecimal(33795)),
                                    new Car("Audi", new BigDecimal(34295))};
        carModelsCombo = new JComboBox<>(carModels);
        carModelsCombo.setSelectedIndex(-1);
        mainPanel.add(carModelsCombo, gbc);
        carModelLabel.setLabelFor(carModelsCombo);

        gbc.gridx = 0;
        gbc.gridy = 4;
        JLabel daysLabel = new JLabel("Days");
        daysLabel.setDisplayedMnemonic(KeyEvent.VK_D);
        mainPanel.add(daysLabel, gbc);
        gbc.gridx = 1;
        daysCombo = new JComboBox<>(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        daysCombo.setSelectedIndex(-1);
        mainPanel.add(daysCombo, gbc);
        daysLabel.setLabelFor(daysCombo);

        gbc.gridx = 0;
        gbc.gridy = 5;
        hireButton = new JButton("Hire");
        hireButton.setMnemonic(KeyEvent.VK_H);
        hireButton.addActionListener(this);
        mainPanel.add(hireButton, gbc);
        gbc.gridx = 1;
        priceTextField = new JTextField(10);
        mainPanel.add(priceTextField, gbc);

        return mainPanel;
    }

    private void displayPrice() {
        Car car = (Car) carModelsCombo.getSelectedItem();
        if (car != null) {
            BigDecimal price = car.getPrice();
            priceTextField.setText(price.toString());
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new CarsHire());
    }
}

class Car {
    private String model;
    private BigDecimal price;

    public Car(String model, BigDecimal price) {
        this.model = model;
        this.price = price;
    }

    public String getModel() {
        return model;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public String toString() {
        return model;
    }
}

Swing код выполняется на Поток рассылки событий (EDT). Конструктор JFrame запустит EDT, но было время, когда Oracle рекомендовал явный запуск EDT с помощью метода invokeLater() класса EventQueue. Этот метод принимает один аргумент, который является экземпляром класса, который реализует интерфейс Runnable.

Swing использует Model-View-Controller (MVC) парадигма, поэтому у каждого компонента Swing есть модель , в которой хранятся данные, отображаемые компонентом. JComboBox модель - это список предметов. Этот список может содержать объекты любого класса. Значение, отображаемое JComboBox, является значением, возвращаемым методом toString() класса. Поэтому я создал класс Car, который содержит модель автомобиля и его цену. Следовательно, в JComboBox отображается только модель [car], но выбранный элемент на самом деле является экземпляром класса Car. Поэтому в методе displayPrice() я знаю, что значение, возвращаемое getSelectedItem(), должно быть экземпляром Car (или ноль, если ничего не выбрано). Отсюда легко получить цену [автомобиля] и отобразить ее в priceTextField.

Изначально я думал, что цена означает реальную цену автомобиля, поэтому я использовал BigDecimal для цена в классе Car.

Как я уже сказал в своем комментарии к вашему вопросу, я использую GridBagLayout, так как он очень подходит для размещения форм. Существуют и другие менеджеры компоновки, которые также подходят для размещения форм. Я просто привык использовать GridBagLayout.

Я также использую мнемонику. Например, если вы нажмете клавиши Alt + H, активируется кнопка Hire , а если вы нажмете Alt + N, текстовое поле Name станет сфокусированным.

См. Использование контейнеров верхнего уровня , который является частью Oracle java учебников. По умолчанию панель содержимого для JFrame - это JPanel, менеджер компоновки которого BorderLayout. Когда вы программируете на Swing , вам нужно много смотреть на исходный код, чтобы понять, что происходит и как лучше всего использовать фреймворк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...