JSwing:Action执行创建一个新窗口。

时间:2017-02-22 05:31:47

标签: java swing actionlistener

我目前正在使用JSwing开发一个程序。

我让程序使用正确的逻辑,但出于某种原因,当我输入第一个输入时,它会创建一个具有正确更改的新窗口。

它只创建一个新窗口。

以下是我的转换器的代码

    public class Converter extends JFrame{
        //Creating text fields to be put into the "Distance" Tab
        JTextField metersTxt = new JTextField(), feetTxt = new JTextField(),milesTxt = new JTextField(), 
        inchesTxt = new JTextField(), cmTxt = new JTextField(), kmTxt = new JTextField(); 




public Converter(){
               //Creating the GUI object for frame 
               JFrame frame = new JFrame("Distance/Energy Converter");
               frame.setSize(600, 600);
               frame.setVisible(true);

               //Assigning a name to JTextFile
               metersTxt.setName("meters");
               feetTxt.setName("feet");
               milesTxt.setName("miles");
               inchesTxt.setName("inches");
               cmTxt.setName("cm");
               kmTxt.setName("km");

               //Making an instance of a tabbedPane to be able to add 2 panes. 
               JTabbedPane tabbedPane = new JTabbedPane();

               //Making the first tab to convert distance values 
               JPanel panel1 = new JPanel(true);
               tabbedPane.addTab("Distance", panel1);
               panel1.setLayout(new GridLayout(0,6));

               //A second tab to switch to energy conversions
               JPanel panel2 = new JPanel(true);
               tabbedPane.addTab("Energy", panel2);
               panel2.setLayout(new GridLayout(0,6));

               //Add the tabbedPane to this panel.
               frame.add(tabbedPane);

               //Creates labels for the "Distance" tab
               JLabel meters = new JLabel("Meters");
               JLabel feet = new JLabel("Feet");
               JLabel miles = new JLabel("Miles");         
               JLabel inches = new JLabel("Inches");           
               JLabel cm = new JLabel("Centimeters");         
               JLabel km = new JLabel ("Kilometers");

               //Create labels for the "Energy" tab
               JLabel joule = new JLabel("Joule");
               JLabel cal = new JLabel("Calorie");
               JLabel volt = new JLabel("Volt");
               JLabel watt = new JLabel("Watt");
               JLabel thermal = new JLabel("Thermal Units");

               //Adding labels and text boxes to distance panel in order to be formatted right 
               panel1.add(meters); 
               panel1.add(metersTxt);
               panel1.add(feet); 
               panel1.add(feetTxt);
               panel1.add(miles); 
               panel1.add(milesTxt);
               panel1.add(inches); 
               panel1.add(inchesTxt);
               panel1.add(cm); 
               panel1.add(cmTxt);
               panel1.add(km); 
               panel1.add(kmTxt);

               //Allowing the user to edit the text boxes 
               metersTxt.setEditable(true);
               feetTxt.setEditable(true);
               milesTxt.setEditable(true);
               inchesTxt.setEditable(true);
               cmTxt.setEditable(true);
               kmTxt.setEditable(true);

               //Attaching the metric listener to each JTextField 
               metersTxt.addActionListener(new MetricListener());
               feetTxt.addActionListener(new MetricListener());
               milesTxt.addActionListener(new MetricListener());
               inchesTxt.addActionListener(new MetricListener());
               cmTxt.addActionListener(new MetricListener());
               kmTxt.addActionListener(new MetricListener());

               //To clean up interface and close it when close the window 
               frame.pack();
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }


        public static void main(String args[]){
            Converter mf = new Converter();
        }



}

然后是我的听众课

public class MetricListener implements ActionListener
{

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Converter c = null;
        c = new Converter();

        //Getting where the action takes place 
        JTextField txt = new JTextField();
        txt = (JTextField) e.getSource();

        //Extracting input from GUI
        String input = null;
        input = e.getActionCommand();

        //Turing the taken in value into type double 
        double value = 0;
        value = Double.parseDouble(input);

        //Variables to hold values for conversions 
        double meters = 0, feet = 0, miles = 0, inches = 0, cm = 0, km = 0;

        String txtName = null;
        txtName = txt.getName();

        //The following if statements are seeing which JTextField is being changed  
        if(txtName.equals("meters")){

            //Creating conversions from meters 
            meters = value;
            feet = value * .3048;
            miles = value * 0.000621371;
            inches = value * 39.3701;
            cm = value * 100;
            km = value * .001;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));


        }

        else if(txtName.equals("feet")){
            //Creating conversions from feet 
            meters = value * .3048;
            feet = value ;
            miles = value * 0.000189394;
            inches = value * 12;
            cm = value * 30.48;
            km = value * 0.0003048;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));
        }
        else if(txtName.equals("miles")){
            //Creating conversions from feet 
            meters = value * 1609.34;
            feet = value * 5280;
            miles = value;
            inches = value * 63360;
            cm = value * 160934;
            km = value * 1.60934;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));
        }
        else if(txtName.equals("inches")){
            //Creating conversions from feet 
            meters = value * 0.0254;
            feet = value * 0.0833333;
            miles = value * .0000157828;
            inches = value;
            cm = value * 2.54;
            km = value * .0000254;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));
        }
        else if(txtName.equals("cm")){
            //Creating conversions from feet 
            meters = value * 0.01;
            feet = value * 0.0328084;
            miles = value * .00000621371;
            inches = value * 0.393701;
            cm = value;
            km = value * .00001;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));
        }
        else if(txtName.equals("km")){
            //Creating conversions from feet 
            meters = value * 1000f;
            feet = value * 3280.84;
            miles = value * 0.621371;
            inches = value * 39370.1;
            cm = value * 100000;
            km = value;

            //Applying the converted values to respected places
            c.metersTxt.setText(Double.toString(meters));
            c.feetTxt.setText(Double.toString(feet));
            c.milesTxt.setText(Double.toString(miles));
            c.inchesTxt.setText(Double.toString(inches));
            c.cmTxt.setText(Double.toString(cm));
            c.kmTxt.setText(Double.toString(km));
        }

    }

}

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

你的第一个问题是在Converter()中创建一个新的JFrame。 Converter已经是一个JFrame,所以你可以使用“this”代替auf“frame”。

我认为打开一个新窗口并不打算,所以不要在actionPerformed中创建一个新的Converter。因此,请将转换器的引用提供给MetricListener。如果你让MetricListener成为Converter的内部类,那么它就更容易了。

我试着在这里展示重点:

public class Converter extends JFrame{
    //Creating text fields to be put into the "Distance" Tab
  JTextField metersTxt = new JTextField(), feetTxt = new JTextField(),milesTxt = new JTextField(), inchesTxt = new JTextField(), cmTxt = new JTextField(), kmTxt = new JTextField(); 

    //Creating the GUI object for frame 
    public Converter() {
        this.setTitle("Distance/Energy Converter");
        this.setSize(600, 600);
        this.setVisible(true);

...

        //Add the tabbedPane to this panel.
        this.add(tabbedPane);

...

        //To clean up interface and close it when close the window 
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  }

    public class MetricListener implements ActionListener
{

    @Override
    public void actionPerformed(ActionEvent e)
    {
              /* DO NOT CREATE A NEW Converter */

                ...

                //The following if statements are seeing which JTextField is being changed  
        if(txtName.equals("meters")){

                        ....

                      /* Since it is an inner class you can use these variables directly */

            //Applying the converted values to respected places
            metersTxt.setText(Double.toString(meters));
            feetTxt.setText(Double.toString(feet));
            milesTxt.setText(Double.toString(miles));
            inchesTxt.setText(Double.toString(inches));
            cmTxt.setText(Double.toString(cm));
            kmTxt.setText(Double.toString(km));


        }

        else if(txtName.equals("feet")){
                    /* and so on */
        }

    }

    }

    public static void main(String args[]){
        Converter mf = new Converter();
    }

}

答案 1 :(得分:1)

您的程序每次都会创建一个新的框架,因为在actionPerformed的{​​{1}}方法中,您每次都会调用

MetricListener

每次都会创建并显示新的c = new Converter();

解决方案是每次都避免新转换器的实例化,并将其作为本地字段,例如如下所示

MetricListener

JFrame

转换器

public class MetricListener implements ActionListener
{
        //add field c of class Converter
    private Converter c;

        //create COntructor with Converter parameter 
    public MetricListener(Converter c){
        this.c=c;

    }

    @Override
    public void actionPerformed(ActionEvent e)
    {

        //Comment converte creation   
        //Converter c = null;
        //c = new Converter();
.....
//All the rest of the Class as before