好的,我有一个Jlist,一个组合框,一个订单和一个Stats JButton;我在Jlist和Jcombobox中有几个选择。在我点击订单几次,每次改变选择后,我想要统计按钮,在我点击之后,打开一个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;
}
}
答案 0 :(得分:1)
我在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 = {"Cheeseburger w/ Fries & Drink",
"Dbl Cheeseburger w/ Fries & Drink",
"Big N' Tasty w/ Fries & Drink",
"Dbl Qtr Pounder w/ Fries & Drink",
"Big Mac w/ Fries & Drink"};
然后,不是按照你在JList中的方式填充这些元素,而是可以在for循环中迭代foodArrVals进行填充。
而且,而不是你的行:
String strMostFd = (String) jlFood.getSelectedValue();
String strLeastFd = (String) jlFood.getSelectedValue();
因为你已经拥有了最多选择的索引,现在你可以通过数组轻松地从索引到值的映射,你可以这样做:
String strMostFd = foodArrVals[mostPFood];
String strLeastFd = foodArrVals[leastPFood];
您可以对尺寸选择执行相同的操作。
或者,如果您不想预先声明值数组(尽管我认为这是这种情况下的最佳方法),您可以执行以下操作:
String strMostFd = (String) jlFood.getItemAt(mostPFood);