java - 如何选择 JList 中的两个索引以及 JComboBox 中的两个项目?

标签 java swing indexing jcombobox jlist

好吧,我有一个 Jlist、一个组合框、一个订单和一个统计 JButton;我在 Jlist 和 Jcombobox 中都有多个选择。在我单击 order 几次后,每次都会改变选择,我希望“统计”按钮在单击后打开一个 JFrame,显示 Jlist 和 Jcombobox 中最受欢迎的选择和最不受欢迎的选择。我已经找到了如何在其 JTextField 中显示最受欢迎的内容,但我很难显示最少的内容。这是我到目前为止所拥有的:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class FoodClass extends JApplet implements ActionListener
{
    JFrame jfStats;
    JButton jbStats, jbOrder;
    JList jlFood;
    DefaultListModel dlmFood;
    JComboBox jcbSize;
    JTextField jtfPopularFd, jtfUnpopularFd, jtfPopularSz, jtfUnpopularSz;
    JLabel jlabPopular, jlabUnpopular, jlabTitle;
    JPanel jpTop, jpMiddle;
    int[] foodArr = new int[5];
    int[] sizeArr = new int[3];
    public void init()
    {
        //Just the GUI (Skip down to the next method)
        System.out.println("Applet opened");
        jlabTitle = new JLabel("Mickey's");
        jfStats = new JFrame();
        jbStats = new JButton("Stats");
        jbOrder = new JButton("Order");
        dlmFood = new DefaultListModel();
        jlFood = new JList(dlmFood);
        dlmFood.addElement("Cheeseburger w/ Fries & Drink");
        dlmFood.addElement("Dbl Cheeseburger w/ Fries & Drink");
        dlmFood.addElement("Big N' Tasty w/ Fries & Drink");
        dlmFood.addElement("Dbl Qtr Pounder w/ Fries & Drink");
        dlmFood.addElement("Big Mac w/ Fries & Drink");
        jcbSize = new JComboBox();
        jcbSize.addItem("Small");
        jcbSize.addItem("Medium");
        jcbSize.addItem("Large");
        jbStats.addActionListener(this);
        jbOrder.addActionListener(this);
        jpTop = new JPanel(new FlowLayout());
        jpTop.add(jlabTitle);
        jpMiddle = new JPanel(new FlowLayout());
        jpMiddle.add(jlFood);
        jpMiddle.add(jcbSize);
        jpMiddle.add(jbOrder);
        jpMiddle.add(jbStats);
        add(jpTop, BorderLayout.NORTH);
        add(jpMiddle, BorderLayout.CENTER);
    }
    public void actionPerformed(ActionEvent e)
    {
        Object src = e.getSource();
        if(src == jbOrder) processjbOrder();
        if(src == jbStats) processjbStats();
    }
    public void processjbOrder()
    {
        int foodInt = jlFood.getSelectedIndex();
        int sizeInt = jcbSize.getSelectedIndex();
        foodArr[foodInt]++;//Increasing the selected Array by 1 every time the Order button is
        //pressed
        System.out.println("Food Ind = "+foodArr[foodInt]);
        sizeArr[sizeInt]++;
        System.out.println("Size Ind = "+sizeArr[sizeInt]);
    }
    public void processjbStats()
    {
        jfStats.setVisible(true);//opening the JFrame when the stats button is pressed
        jfStats.setSize(200, 200);
        jlabPopular = new JLabel("Most Popular");
        jlabUnpopular = new JLabel("Least Popular");
        jtfPopularFd = new JTextField(10);
        jtfUnpopularFd = new JTextField(10);
        jtfPopularSz = new JTextField(10);
        jtfUnpopularSz = new JTextField(10);
        jfStats.setLayout(new FlowLayout());
        jfStats.add(jlabPopular); jfStats.add(jtfPopularFd); jfStats.add(jtfPopularSz);
        jfStats.add(jlabUnpopular); jfStats.add(jtfUnpopularFd); jfStats.add(jtfUnpopularSz);
        int mostPFood = findMax(foodArr);
        System.out.println("Most Popular Food = "+mostPFood);
        int mostPSize = findMax(sizeArr);
        System.out.println("Most Popular Size = "+mostPSize);
        int leastPFood = findLeast(foodArr);
        System.out.println("Least Popular Food = "+leastPFood);
        int leastPSize = findLeast(sizeArr);
        System.out.println("Least Popular Size = "+leastPSize);
        //Getting the names of the selected Indexes as opposed to the numbers
        jlFood.setSelectedIndex(mostPFood); 
        jlFood.setSelectedIndex(leastPFood);
        jcbSize.setSelectedItem(mostPSize);
        jcbSize.setSelectedItem(leastPSize);
        String strMostFd = (String) jlFood.getSelectedValue();//Trouble here
        String strLeastFd = (String) jlFood.getSelectedValue();
        String strMostSz = (String) jcbSize.getSelectedItem();
        String strLeastSz = (String) jcbSize.getSelectedItem();
        jtfPopularFd.setText(strMostFd);
        jtfUnpopularFd.setText(strLeastFd);
        jtfPopularSz.setText(strMostSz);
        jtfUnpopularSz.setText(strLeastSz);
    }
    private int findMax(int[] intMax)//Finding the most popular selection
    {
        int largest = intMax[0];
        int maxInd = 0;
        for(int i=0;i<intMax.length;i++)
            if(intMax[i]>largest)
            {
                largest = intMax[i];
                maxInd = i;
            }
        return maxInd;
    }
    private int findLeast(int[] intLeast)//Finding the least popular selection
    {
        int smallest = intLeast[0];
        int leastInd = 0;
        for(int i=0;i<intLeast.length;i++)
            if(1>=intLeast[i] && intLeast[i]<smallest)//Trying to find out how to find the
                //least popular selection, that was ACTUALLY SELECTED...
            {
                smallest = intLeast[i];
                leastInd = i;
            }
        return leastInd;
    }
}

最佳答案

我在您的 findLeast 方法中发现了一个问题,在 if 语句中,您有

1>=intLeast[i]

虽然应该如此

1<=intLeast[i]

这样您就可以确保它至少被选择一次,而不是只选择一次或没有选择。

就我个人而言,我发现将要比较的内容放在左侧会更清晰:

intLeast[i]>=1


编辑:回答您的评论(我之前没有意识到问题的范围):
不可能在 Swing 中的 JComboBox 上设置 2 个不同的值。在 JList 上是可能的;但是,您尝试执行此操作的方式并不是在统计窗口中设置最小值和最大值的方法,也没有必要。

您在哪里执行此操作:
jlFood.setSelectedIndex(mostPFood);
jlFood.setSelectedIndex(leastPFood);
jcbSize.setSelectedItem(mostPSize);
jcbSize.setSelectedItem(leastPSize);
你不应该这样;你可以删除这些行。您不需要更改现有组件中的值,因为您已经有了最小和最大索引。您不应仅仅为了进行计算而更改输入选择。仅当您希望用户选择的输入发生变化时,您才应更改输入选择,即,如果从一个组件中进行的选择更改了用户应该能够在另一组件中进行选择的内容。

我将声明数组中每个组件的值,以便您可以轻松地将索引映射到值。像这样的事情:
String[] foodArrVals = {"芝士汉堡配薯条和饮料",
“双人芝士汉堡配薯条和饮料”,
“美味可口,配薯条和饮料”,
“双人 Qtr 磅配薯条和饮料”,
“巨无霸配薯条和饮料”};

然后,您可以在 for 循环中迭代 foodArrVals 中执行此操作,而不是像在 JList 中那样填充这些元素。

另外,代替您的线路:
String strMostFd = (String) jlFood.getSelectedValue();
String strLeastFd = (String) jlFood.getSelectedValue();
由于您已经有了最常选择的索引,并且现在您可以通过数组轻松地将索引映射到值,因此您可以执行以下操作:
String strMostFd = foodArrVals[mostPFood];
String strLeastFd = foodArrVals[leastPFood];

您可以对尺寸选择执行相同的操作。

或者,如果您不想预先声明值数组(尽管我认为这是本例中最好的方法),您可以这样做:
String strMostFd = (String) jlFood.getItemAt(mostPFood);

关于java - 如何选择 JList 中的两个索引以及 JComboBox 中的两个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985014/

相关文章:

java - JAX-RS/Jersey 如何自定义错误处理?

java - LocalDateTime 带有附加注释

java - java swing 中的非静态方法 getContentPane() 无法从静态上下文错误中引用

indexing - 重新启动Elasticsearch时为什么会显示已删除的索引?

java - 如何从 JNDI NamingException 中提取 "error code"数字?

java - Netty TCP 服务器 - 在创建 channel 之前拒绝 IP

java - JComboBox 在下拉列表中导航选择项目

java - 如何更改选定单元格的整列和整行的背景

solr - SOLR 可以执行 UPSERT 吗?

JQuery Datatables 行索引未显示相应页面