簡體   English   中英

如何根據條件更改 JComboBox 的內容?

[英]How to change the contents of JComboBox based on a condition?

我對 OOP 和學習比較陌生。 我一直在弄清楚如何才能更改窗格的內容。

我想要發生的是如果我點擊一個不同的單位,兩個窗格的內容將根據我選擇的單位而改變。

像這樣: 1 2 3

這是我的代碼的要點:

    private Container c;
    private JTextField t1;
    private JTextField t2;
    private JButton b1;
    String[] choicelen = {"meter", "kilometer", "centimeter", "millimeter", "mile", "yard", "foot"};
    private JComboBox clen;
    String[] choicelen1 = {"meter", "kilometer", "centimeter", "millimeter", "mile", "yard", "foot"};
    private JComboBox clen1;
    String[] choicetem = {"celsius", "kelvin", "fahrenheit"};
    String[] choicetem1 = {"celsius", "kelvin", "fahrenheit"};
    String[] choicearea = {"acre", "hectare", "sq mile", "sq yard", "sq foot", "sq inch"};
    String[] choicearea1 = {"acre", "hectare"};
    String[] choicevol = {"liter", "milliliter", "gallon", "quart", "pint", "cup", "fluid ounce"};
    String[] choicevol1 = {"liter", "milliliter", "gallon", "quart", "pint", "cup", "fluid ounce"};
    String[] choicewt = {"gram", "kilogram", "milligram", "metric ton", "pound", "ounce", "carrat"};
    String[] choicewt1 = {"gram", "kilogram", "milligram", "metric ton", "pound", "ounce", "carrat"};
    String[] choicetime = {"second", "millisecond", "minute", "hour", "day", "week", "month", "year"};
    String[] choicetime1 = {"second", "millisecond", "minute", "hour", "day", "week", "month", "year"};
    String[] choices = {"Length", "Temperature", "Area", "Volume", "Weight", "Time"};
    private JComboBox c3;

介紹

OP 的代碼不是最小的可重現示例

所以,我繼續創建了以下 GUI。

工具

我只對長度和溫度的轉換進行了編碼。 我將 rest 作為 OP 的練習。

解釋

Oracle 有一個有用的教程,使用 Swing 創建 GUI 跳過學習 Swing 和 NetBeans IDE 部分。

當我創建 Swing GUI 時,我使用model-view-controller (MVC) 模式。 這種模式使我能夠分離我的關注點並一次專注於應用程序的一部分。

model 是任何 Swing 應用程序中最重要的部分。 一個好的 model 使得編碼視圖和控制器變得容易得多。

  • Swing model 由一個或多個普通的 Java getter/setter 類組成。
  • 一個 Swing 視圖由一個JFrame和所需數量的JPanelsJDialogs
  • 一個 Swing controller 是一個修改 model 並更新視圖的ActionListener

一個 Swing 應用程序通常有多個 controller 類。

Model

我為此應用程序創建了兩個 model 類。

Measurement class 包含一個文本字符串、一個乘法器和一個加法器。

讓我們采用溫度轉換的公式。

f = (c * 9/5) + 32
c = (f - 32) / 9/5

任何測量轉換的通用公式是

to value = (from value * multiplier) + adder

因此,對於長度,我將 from 值轉換為毫米,並將毫米轉換為 to 值。 我對溫度做了類似的事情,我將 from 值轉換為 celsius,並將 celsius 轉換為 to 值。

這樣,我減少了進行轉換所需的代碼。 OP 所要做的就是在UnitConversionModel class 中插入乘法器和加法器的 rest。

UnitConversionModel class 包含一個帶有String鍵的Map和一個List<Measurement> object。這個Map允許我輕松填充JComboBoxes並為我提供轉換值。

看法

我大致根據 OP 的圖片生成了一個視圖。 model 使構建視圖更簡單。

Controller

我編碼了兩個 controller 類。

ComboBoxListener class 在轉換單元JComboBoxes中填寫 from 轉換單元和 to 轉換單元。

ButtonListener class 進行單位轉換。

代碼

這是完整的可運行代碼。 我制作了額外的類內部類,這樣我就可以將代碼作為一個塊發布。

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
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.SwingUtilities;

public class UnitConversionTool implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new UnitConversionTool());
    }

    private JComboBox<Measurement> fromMeasurementComboBox,
            toMeasurementComboBox;
    private JComboBox<String> measurementTypeComboBox;

    private JTextField fromMeasurementField, toMeasurementField;

    private UnitConversionModel model;

    public UnitConversionTool() {
        this.model = new UnitConversionModel();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Unit Conversion Tool");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel(), BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.NONE;
        gbc.insets = new Insets(0, 5, 5, 5);

        String[] measurementTypes = model.getMeasurementTypes();

        gbc.gridwidth = 2;
        gbc.gridx = 0;
        gbc.gridy = 0;
        measurementTypeComboBox = new JComboBox<>(measurementTypes);
        String measurementType = measurementTypes[measurementTypes.length - 1];
        measurementTypeComboBox.setSelectedItem(measurementType);
        measurementTypeComboBox
                .addActionListener(new ComboBoxListener(this, model));
        panel.add(measurementTypeComboBox, gbc);

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = 1;
        gbc.gridy++;
        gbc.weightx = 1.0;
        panel.add(new JLabel("From"), gbc);

        Measurement[] measurementUnits = model
                .getMeasurementList(measurementType);

        gbc.gridx++;
        fromMeasurementComboBox = new JComboBox<>(measurementUnits);
        panel.add(fromMeasurementComboBox, gbc);

        gbc.gridx++;
        fromMeasurementField = new JTextField(10);
        panel.add(fromMeasurementField, gbc);

        gbc.gridx++;
        panel.add(new JLabel("to"), gbc);

        gbc.gridx++;
        toMeasurementComboBox = new JComboBox<>(measurementUnits);
        panel.add(toMeasurementComboBox, gbc);

        gbc.gridx++;
        toMeasurementField = new JTextField(10);
        toMeasurementField.setEditable(false);
        panel.add(toMeasurementField, gbc);

        gbc.gridwidth = 6;
        gbc.gridx = 0;
        gbc.gridy++;
        JButton button = new JButton("Convert");
        button.addActionListener(new ButtonListener(this, model));
        panel.add(button, gbc);

        return panel;
    }

    public JComboBox<Measurement> getFromMeasurementComboBox() {
        return fromMeasurementComboBox;
    }

    public JComboBox<Measurement> getToMeasurementComboBox() {
        return toMeasurementComboBox;
    }

    public JComboBox<String> getMeasurementTypeComboBox() {
        return measurementTypeComboBox;
    }

    public JTextField getFromMeasurementField() {
        return fromMeasurementField;
    }

    public JTextField getToMeasurementField() {
        return toMeasurementField;
    }

    public class ComboBoxListener implements ActionListener {

        private final UnitConversionTool view;

        private final UnitConversionModel model;

        public ComboBoxListener(UnitConversionTool view,
                UnitConversionModel model) {
            this.view = view;
            this.model = model;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            String selectedMeasurementType = (String) view
                    .getMeasurementTypeComboBox().getSelectedItem();
            Measurement[] measurementUnits = model
                    .getMeasurementList(selectedMeasurementType);
            int count = view.getFromMeasurementComboBox().getItemCount();
            for (int index = count - 1; index >= 0; index--) {
                view.getFromMeasurementComboBox().removeItemAt(index);
                view.getToMeasurementComboBox().removeItemAt(index);
            }

            for (Measurement m : measurementUnits) {
                view.getFromMeasurementComboBox().addItem(m);
                view.getToMeasurementComboBox().addItem(m);
            }
        }

    }

    public class ButtonListener implements ActionListener {

        private final UnitConversionTool view;

        private final UnitConversionModel model;

        public ButtonListener(UnitConversionTool view,
                UnitConversionModel model) {
            this.view = view;
            this.model = model;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            Measurement fromMeasurement = (Measurement) view
                    .getFromMeasurementComboBox().getSelectedItem();
            Measurement toMeasurement = (Measurement) view
                    .getToMeasurementComboBox().getSelectedItem();
            double fromValue = Double
                    .valueOf(view.getFromMeasurementField().getText());
            double toValue = (fromValue + fromMeasurement.getAdder())
                    * fromMeasurement.getMultiplier();
            toValue = toValue / toMeasurement.getMultiplier()
                    - toMeasurement.getAdder();
            String text = String.format("%.2f", toValue);
            view.getToMeasurementField().setText(text);
        }

    }

    public class UnitConversionModel {
        private final Map<String, List<Measurement>> measurementMap;

        private final Measurement[] lengthMeasurements = {
                new Measurement("meter", 1000, 0),
                new Measurement("kilometer", 1_000_000, 0),
                new Measurement("centimeter", 10, 0),
                new Measurement("millimeter", 1, 0),
                new Measurement("mile", 1.609344e+6, 0),
                new Measurement("yard", 914.4, 0),
                new Measurement("foot", 304.8, 0) };
        private final Measurement[] temperatureMeasurements = {
                new Measurement("celsius", 1, 0),
                new Measurement("kelvin", 1, -273.15),
                new Measurement("fahrenheit", 5.0 / 9.0, -32) };
        private final Measurement[] areaMeasurements = {
                new Measurement("acre", 0, 0), new Measurement("hectare", 0, 0),
                new Measurement("sq mile", 0, 0),
                new Measurement("sq yard", 0, 0),
                new Measurement("sq foot", 0, 0),
                new Measurement("sq inch", 0, 0) };
        private final Measurement[] volumeMeasurements = {
                new Measurement("liter", 0, 0),
                new Measurement("milliliter", 0, 0),
                new Measurement("gallon", 0, 0), new Measurement("quart", 0, 0),
                new Measurement("pint", 0, 0), new Measurement("cup", 0, 0),
                new Measurement("fluid ounce", 0, 0) };
        private final Measurement[] weightMeasurements = {
                new Measurement("gram", 0, 0),
                new Measurement("kilogram", 0, 0),
                new Measurement("milligram", 0, 0),
                new Measurement("metric ton", 0, 0),
                new Measurement("pound", 0, 0), new Measurement("ounce", 0, 0),
                new Measurement("carat", 0, 0) };
        private final Measurement[] timeMeasurements = {
                new Measurement("second", 0, 0),
                new Measurement("millisecond", 0, 0),
                new Measurement("minute", 0, 0), new Measurement("hour", 0, 0),
                new Measurement("day", 0, 0), new Measurement("week", 0, 0),
                new Measurement("month", 0, 0), new Measurement("year", 0, 0) };

        private final String[] measurementTypes = { "Length", "Temperature",
                "Area", "Volume", "Weight", "Time" };
        private final Measurement[][] measurements = { lengthMeasurements,
                temperatureMeasurements, areaMeasurements, volumeMeasurements,
                weightMeasurements, timeMeasurements };

        public UnitConversionModel() {
            this.measurementMap = new LinkedHashMap<>();
            for (int index = 0; index < measurementTypes.length; index++) {
                String s = measurementTypes[index];
                Measurement[] measurementUnits = measurements[index];
                List<Measurement> measurementList = new ArrayList<>();
                for (Measurement m : measurementUnits) {
                    measurementList.add(m);
                }
                measurementMap.put(s, measurementList);
            }
        }

        public String[] getMeasurementTypes() {
            return measurementTypes;
        }

        public Measurement[] getMeasurementList(String measurement) {
            List<Measurement> measurementList = measurementMap.get(measurement);
            return measurementList
                    .toArray(new Measurement[measurementList.size()]);
        }
    }

    public class Measurement {

        private final double adder, multiplier;

        private final String text;

        public Measurement(String text, double multiplier, double adder) {
            this.text = text;
            this.multiplier = multiplier;
            this.adder = adder;
        }

        public double getAdder() {
            return adder;
        }

        public double getMultiplier() {
            return multiplier;
        }

        @Override
        public String toString() {
            return text;
        }
    }

}

我通過添加從類似帖子中找到的這段代碼來讓它工作:

    c3 = new JComboBox<>(choices);
    c.add(c3);

    choose = new JComboBox<>(choicelen);
    c.add(choose);

    choose1 = new JComboBox<>(choicelen1);
    c.add(choose1);

    c3.addActionListener(new Listener());
    
    class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if (c3.getSelectedItem().equals("Length")) {
            choose.setModel(new JComboBox<>(choicelen).getModel()); 
            choose1.setModel(new JComboBox<>(choicelen1).getModel());
        }
        else if (c3.getSelectedItem().equals("Temperature")) {
            choose.setModel(new JComboBox<>(choicetem).getModel()); 
            choose1.setModel(new JComboBox<>(choicetem1).getModel());
        }
        else if (c3.getSelectedItem().equals("Area")) {
            choose.setModel(new JComboBox<>(choicearea).getModel()); 
            choose1.setModel(new JComboBox<>(choicearea1).getModel());
        }
        else if (c3.getSelectedItem().equals("Volume")) {
            choose.setModel(new JComboBox<>(choicevol).getModel()); 
            choose1.setModel(new JComboBox<>(choicevol1).getModel());
        }
        else if (c3.getSelectedItem().equals("Weight")) {
            choose.setModel(new JComboBox<>(choicewt).getModel()); 
            choose1.setModel(new JComboBox<>(choicewt1).getModel());
        }
        else if (c3.getSelectedItem().equals("Time")) {
            choose.setModel(new JComboBox<>(choicetime).getModel()); 
            choose1.setModel(new JComboBox<>(choicetime1).getModel());
        }
        
    }   
    }

感謝你們!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM