【问题标题】:How do I add prices to items in a combo box?如何为组合框中的项目添加价格?
【发布时间】:2020-03-22 19:16:39
【问题描述】:

我需要在 Eclipse 中使用 Swing 创建一个简单的 GUI 应用程序。我决定做一个简单的租车服务应用。

我不太确定如何将价格附加到两个单独组合框中的车型和日期。我也不太清楚一旦按下租用按钮,如何使汽车型号和日期的组合价格出现在文本框中。

下面是我的 GUI 的图片,这样你们就可以看到我正在使用什么。我还添加了到目前为止的代码。

Picture of my 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);}


                 }
    }

【问题讨论】:

标签: java eclipse swing


【解决方案1】:

下面的代码应该可以帮助您入门。它不完整,因为我没有找到您问题中的所有要求。

代码后的解释。

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 代码在 Event Dispatch Thread (EDT) 上执行。 JFrame 构造函数将启动 EDT,但有一段时间,Oracle 建议通过 EventQueue 类的方法 invokeLater() 显式启动 EDT。该方法采用单个参数,该参数是实现Runnable 接口的类的实例。

Swing 使用 Model-View-Controller (MVC) 范例,因此每个 Swing 组件都有一个 model存储组件显示的数据。 JComboBox model 是它的项目列表。该列表可以包含任何类的对象。 JComboBox显示的值就是类的toString()方法返回的值。因此,我创建了一个包含汽车型号及其价格的Car 类。因此,JComboBox 中显示的只是 [car] 模型,但所选项目实际上是类 Car 的一个实例。所以在displayPrice()方法中,我知道getSelectedItem()返回的值一定是Car的一个实例(或者如果什么都没选则为null)。从那里很容易获得 [汽车] 价格并将其显示在 priceTextField 中。

最初,我认为价格是汽车的实际价格,这就是为什么我在Car 类中使用BigDecimal 作为价格

正如我在comment 中对您的问题所说,我使用GridBagLayout,因为它非常适合布局表单。还有其他布局管理器也适用于布局表单。我只是习惯使用GridBagLayout

我也使用助记符。例如,如果您按 Alt+H 键,它将激活 Hire 按钮,如果您按 Alt+N,则 Name 文本字段将成为焦点字段。

请参阅Using Top-Level Containers,这是 Oracle 的 java 教程的一部分。 JFrame 的默认 内容窗格JPanel,其布局管理器为 BorderLayout。当您在 Swing 中编程时,您需要大量查看源代码以了解发生了什么以及如何最好地利用该框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多