BlueJを使用していますが、問題が発生しました。 3つのオプションがあるコンボボックスがあります。各オプションは文字列です。 3つのオプションは、日、週、および月です。私がやりたいのは、変数が30(double)に等しいよりもDayが選択された場合などです。コンボボックスで選択したオプションに基づいて「emailvalue」に値を与える方法を教えてくれる人が購入を手伝ってもらえますか?
編集:私は毎月のデータ計算機である私の実際のプログラムコードを追加するつもりです。コンパイルします。
コードは次のとおりです。
import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;
import javax.swing.event.*;
import Java.awt.image.*;
import Java.awt.geom.*;
import Java.awt.Color;
import Java.awt.Container;
import Java.awt.Graphics;
import Java.awt.event.WindowAdapter;
import Java.awt.event.WindowEvent;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
/**
* @author (Andrew Napier, Sikander Singh)
* @version (December 18th, 2012)
*/
public class MonthlyData extends JFrame
{
private JLabel title, stitle, l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14;
private JLabel l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,l25,l26,l27,l28,l29;
private JLabel Usage,Estimated,solu1,solu2,total2;
private JPanel panel1, panel2, panel3, panel4, panel5, panel6, panel7;
String[] deviceStrings = { "Blackberry", "Other", "Internetstick"};
String[] date = { "Day", "Week", "Month"};
public double email2 = 0;
public double email1;
static final int email50 = 50;
static final int email100 = 100;
static final int email150 = 150;
static final int email200 = 200;
static final int email250 = 250;
static final int email300 = 300;
public JSlider Email = new JSlider(0,300,0);
public JSlider Web = new JSlider(0,500,0);
public JSlider IM = new JSlider(0,500,0);
public JSlider Video = new JSlider(0,300,0);
public JSlider Song = new JSlider(0,200,0);
public JSlider App_G = new JSlider(0,100,0);
public String currentdate;
public double emailvalue;
public MonthlyData ()
{
super ("MonthlyData");
setSize (1000,1100);
////////////////////////////////////////////////////// panel1
panel1 = new JPanel ();
panel1.setLayout (new GridLayout(1,1));
panel1.setVisible(true);
panel1.setBackground (Color.black);
title = new JLabel (" WANNA KNOW HOW MUCH DATA",JLabel.LEFT);
title.setForeground(Color.white);
title.setFont (new Font("Times New Roman",Font.BOLD,25));
l1 = new JLabel ("");
l2 = new JLabel ("");
/////////////////////////////////////////////// panel2
panel2 = new JPanel ();
panel2.setLayout (new GridLayout(1,1));
panel2.setVisible(true);
panel2.setBackground (Color.gray);
stitle = new JLabel (" PICK A PHONE OR INTERNET STICK AND THEN DRAG THE .",JLabel.LEFT);
stitle.setForeground(Color.black);
stitle.setFont (new Font("Times New Roman",Font.BOLD,14));
//////////////////////////////////////////////// panel3
panel3 = new JPanel ();
panel3.setLayout (new FlowLayout());
panel3.setVisible(true);
panel3.setBackground (Color.white);
l3 = new JLabel ("Select Your Device:",JLabel.RIGHT);
l3.setForeground(Color.red);
JComboBox devicelist = new JComboBox (deviceStrings);
l4 = new JLabel ("Tell us how much of what's listed here you think you'll use:");
///////////////////////////////////////////////// panel4
panel4 = new JPanel ();
panel4.setLayout (new GridLayout(6,7));
panel4.setVisible(true);
panel4.setBackground (Color.white);
l5 = new JLabel ("Email");
l6 = new JLabel ("WebPage");
l7 = new JLabel ("Instant Message");
l8 = new JLabel ("Streaming Video");
l9 = new JLabel ("Song");
l10 = new JLabel ("Application or Game");
l11 = new JLabel (""+" Emails");
final JComboBox date1 = new JComboBox (date);
date1.addActionListener(new ActionListener() {//add actionlistner to listen for change
@Override
public void actionPerformed(ActionEvent e) {
String s = (String) date1.getSelectedItem();//get the selected item
switch (s) {//check for a match
case "Day":
emailvalue = 30;
break;
case "Week":
emailvalue = 4;
break;
case "Month":
emailvalue = 1;
System.out.println("Month selected, emailvalue:" + emailvalue);
break;
}
}
});
l12 = new JLabel (" 0.002 MB");
l13 = new JLabel (""+email2+" MB");
double web1 = 0;
l14 = new JLabel (""+web1+" WebPages");
JComboBox date2 = new JComboBox (date);
l15 = new JLabel (" 0.07 MB");
double web2 = 0;
l16 = new JLabel (""+web2+" MB");
double IM1 = 0;
l17 = new JLabel (""+IM1+" IMs");
JComboBox date3 = new JComboBox (date);
l18 = new JLabel (" 0.005 MB");
double IM2 = 0;
l19 = new JLabel (""+IM2+" MB");
double video1 = 0;
l20 = new JLabel (""+video1+" Minutes");
JComboBox date4 = new JComboBox (date);
l21 = new JLabel (" 1 MB");
double video2 = 0;
l22 = new JLabel (""+video2+" MB");
double song1 = 0;
l23 = new JLabel (""+song1+" MP3's");
JComboBox date5 = new JComboBox (date);
l24 = new JLabel (" 4 MB");
double song2 = 0;
l25 = new JLabel (""+song2+" MB");
double app1 = 0;
l26 = new JLabel (""+app1+" App/Games");
JComboBox date6 = new JComboBox (date);
l27 = new JLabel (" 0.44 MB");
double app2 = 0;
l28 = new JLabel (""+app2+" MB");
//////////////////////////////////////////////// panel5
panel5 = new JPanel ();
panel5.setLayout (new GridLayout(1,1));
panel5.setVisible(true);
panel5.setBackground (Color.white);
solu1 = new JLabel ("WE THINK YOUR MONTHLY DATA USAGE WILL BE:");
solu1.setForeground (Color.red);
solu1.setFont (new Font("Times New Roman",Font.BOLD,20));
double total = 0;
total2 = new JLabel (""+total+" MB");
total2.setForeground (Color.red);
total2.setFont (new Font("Times New Roman",Font.BOLD,20));
/////////////////////////////////////////// panel6
panel6 = new JPanel ();
panel6.setLayout (new GridLayout (1,1));
panel6.setVisible (true);
panel6.setBackground (Color.white);
Usage = new JLabel ("Usage per unit");
Usage.setForeground (Color.red);
Estimated = new JLabel (" Estimated total");
Estimated.setForeground (Color.red);
////////////////////////////////////////////// panel7
panel7 = new JPanel ();
panel7.setLayout (new GridLayout (1,1));
panel7.setVisible (true);
panel7.setBackground (Color.white);
solu2 = new JLabel ("Data usage varies by device and other factors and the .");
solu2.setForeground (Color.black);
/////////////////////////////////////////////////// Implements
Container container = getContentPane ();
container.setLayout (null); //changed
container.setBackground (Color.white);
container.add (panel1).setBounds (0,0,1000,120); //panel1
panel1.add (title).setSize(500,500);
container.add (panel2).setBounds (0,100,1000,120); //panel2
panel2.add (stitle);
container.add (panel3).setBounds (0,220,1000,100); //panel3
panel3.add (l3);
panel3.add (devicelist);
panel3.add (l4);
container.add (panel4).setBounds (0,340,1000,150); //panel4
Email.addChangeListener(new SliderHandler());
Web.addChangeListener(new SliderHandler());
IM.addChangeListener(new SliderHandler());
Video.addChangeListener(new SliderHandler());
Song.addChangeListener(new SliderHandler());
App_G.addChangeListener(new SliderHandler());
panel4.add (l5);
panel4.add (Email);
panel4.add (l11);
panel4.add (date1);
panel4.add (l12);
panel4.add (l13);
panel4.add (l6);
panel4.add (Web);
panel4.add (l14);
panel4.add (date2);
panel4.add (l15);
panel4.add (l16);
panel4.add (l7);
panel4.add (IM);
panel4.add (l17);
panel4.add (date3);
panel4.add (l18);
panel4.add (l19);
panel4.add (l8);
panel4.add (Video);
panel4.add (l20);
panel4.add (date4);
panel4.add (l21);
panel4.add (l22);
panel4.add (l9);
panel4.add (Song);
panel4.add (l23);
panel4.add (date5);
panel4.add (l24);
panel4.add (l25);
panel4.add (l10);
panel4.add (App_G);
panel4.add (l26);
panel4.add (date6);
panel4.add (l27);
panel4.add (l28);
container.add (panel5).setBounds (210,540,1000,50); // panel5
panel5.add (solu1);
panel5.add (total2);
container.add (panel6).setBounds (670,220,200,220); // panel6
panel6.add (Usage);
panel6.add (Estimated);
container.add (panel7).setBounds (210,580,530,50); // panel7
panel7.add (solu2);
Email.setOpaque(false);
Web.setOpaque(false);
IM.setOpaque(false);
Video.setOpaque(false);
Song.setOpaque(false);
App_G.setOpaque(false);
setVisible (true);
}
public static void main (String[] args)
{
MonthlyData application = new MonthlyData ();
}
public class SliderHandler implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
if (e.getSource().equals(Email))
{
l11.setText(""+Email.getValue());
email2= (Email.getValue() * 0.002);
l13.setText(email2 + "MB");
}
if (e.getSource().equals(Web))
{
l14.setText(""+Web.getValue());
}
if (e.getSource().equals(IM))
{
l17.setText(""+IM.getValue());
}
if (e.getSource().equals(Video))
{
l20.setText(""+Video.getValue());
}
if (e.getSource().equals(Song))
{
l23.setText(""+Song.getValue());
}
if (e.getSource().equals(App_G))
{
l26.setText(""+App_G.getValue());
}
}
}
public void Paint (Graphics g)
{
super.Paint(g);
}
}
1)まず、選択したアイテムの変更をリッスンするために、ActionListener
にJComboBox
を追加する必要があります。
2)ActionListener
のactionPerformed(...)
内で、getSelectedItem()
を介して選択したアイテムを取得し、メソッドがString
を返すときにObject
にキャストします。
3)switch
ステートメントを使用して、選択したアイテムが一致するもの、つまり日、月、週を確認し、それに応じて値を割り当てます。
例えば:
_import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MonthlyData {
public double emailvalue;
private String[] date = {"Day", "Week", "Month"};
private JFrame frame;
public MonthlyData() {
frame = new JFrame();//use an instance rather than extending the class
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final JComboBox date1 = new JComboBox(date);
ActionListener cbActionListener = new ActionListener() {//add actionlistner to listen for change
@Override
public void actionPerformed(ActionEvent e) {
String s = (String) date1.getSelectedItem();//get the selected item
switch (s) {//check for a match
case "Day":
emailvalue = 1.1;
System.out.println("Day selected, emailvalue:" + emailvalue);
break;
case "Week":
emailvalue = 2.2;
System.out.println("Week selected, emailvalue:" + emailvalue);
break;
case "Month":
emailvalue = 3.3;
System.out.println("Month selected, emailvalue:" + emailvalue);
break;
default:
emailvalue = 4.4;
System.out.println("No match selected, emailvalue:" + emailvalue);
break;
}
}
};
date1.addActionListener(cbActionListener);
frame.add(date1);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MonthlyData();
}
});
}
}
_
更新:
SSCCEを追加してコメントした後:
SliderHandlerクラスに移動する場合は、email2 =(Email.getValue()* 0.002)* emailvalue;と入力します。あなたがそうするならば、ラベルはリアルタイムで更新されません。ただし、emailvalueをたとえば5に置き換えると、更新されます
問題は
起動時に、emailvalue
はまだ設定されていません。選択したアイテム/インデックスが最初に変更されたときにのみ設定されます。
これを解決するには、表示される前にsetSelectedItem(..)
を呼び出して、デフォルトの選択値を指定する必要があります。
_final JComboBox date1 = new JComboBox(date);
date1.addActionListener(new ActionListener() {//add actionlistner to listen for change
@Override
public void actionPerformed(ActionEvent e) {
String s = (String) date1.getSelectedItem();//get the selected item
switch (s) {//check for a match
case "Day":
emailvalue = 30;
break;
case "Week":
emailvalue = 4;
break;
case "Month":
emailvalue = 1;
System.out.println("Month selected, emailvalue:" + emailvalue);
break;
}
}
});
date1.setSelectedItem(date[0]);//set Day as default selected item/emailvalue
_
コードに関する提案:
Swingコンポーネントは、 EDT
でSwingUtilities.invokeLater(Runnable r)
ブロックを介して作成および操作する必要があります。
JFrame
のPaint(..)
をオーバーライドしないでください。むしろ、JPanel
を追加し、paintComponent(Graphics g)
をオーバーライドしてください。
setBounds
またはsetSize
を呼び出さないでください。適切なLayoutManager
を使用するか、JPanel
のgetPreferredSize()
をオーバーライドして、Dimension
でpack()
を呼び出すよりも内容に合ったJFrame
sを返します。
JFrame
を不必要に拡張しないでください
クラスが1つとして使用される場合や、そのメソッドを他のクラスに公開する必要がある場合を除いて、クラスにActionListener
を実装しないでください。
マップを用意して、選択リスナーで使用するだけです。
HashMap<String,Integer> map = new HashMap();
map.put("Day",1);
map.put("Week",7);
map.put("Month",30);
actionListener
をJComboBox
に追加します。
JComboBox date1 = new JComboBox (date);
date1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
String selectedItem = (String) date1.getSelectedItem();
if(selectedItem.equals("date")
{
emailValue = 30;
}
}
});
クラスはすでにActionListener
を実装しているので、これも実行できます(上記の代わりに)。
actionCommand
をJComboBox
に追加します。
JComboBox date1 = new JComboBox (date);
date1.setActionCommand("date1");
date1.addActionListener(this)
注意: date1
は、actionPerformed
メソッドにアクセスできるように、クラスレベルの変数(フィールド)である必要があります。
actionPerformed
メソッドをクラスに追加します(おそらくすでにこれを持っています)。
public void actionPerformed(ActionEvent ae)
{
if(ae.getActionCommand().equals("date1")
{
String selectedItem = date1.getSelectedItem();
if(selectedItem.equals("date")
{
emailValue = 30;
}
…
//Note: From Java 7, you can use Strings with switch
}
}