【问题标题】:changing from JApplet to JFrame从 JApplet 更改为 JFrame
【发布时间】:2011-07-30 06:23:00
【问题描述】:

所以我有这段代码可以在 Java 中创建一个计算器。但它是用 JApplet 制作的,我需要它与 JFrame 一起使用。需要改什么?

import javax.swing.*;
import javax.swing.JOptionPane;
import java.awt.*;
import java.awt.event.*;

public class Calculator extends JApplet {
   public void init() {
      CalculatorPanel calc=new CalculatorPanel();
      getContentPane().add(calc);
      }
   }

   class CalculatorPanel extends JPanel implements ActionListener {
      JButton 
n1,n2,n3,n4,n5,n6,n7,n8,n9,n0,plus,minus,mul,div,dot,equal;
      static JTextField result=new JTextField("0",45);
      static String lastCommand=null;
      JOptionPane p=new JOptionPane();
      double preRes=0,secVal=0,res;

      private static void assign(String no)
        {
         if((result.getText()).equals("0"))
            result.setText(no);
          else if(lastCommand=="=")
           {
            result.setText(no);
            lastCommand=null;
           }
          else
            result.setText(result.getText()+no);
         }

      public CalculatorPanel() {
         setLayout(new BorderLayout());
         result.setEditable(false);
         result.setSize(300,200);
         add(result,BorderLayout.NORTH);
         JPanel panel=new JPanel();
         panel.setLayout(new GridLayout(4,4));

         n7=new JButton("7");
         panel.add(n7);
         n7.addActionListener(this);
         n8=new JButton("8");
         panel.add(n8);
         n8.addActionListener(this);
         n9=new JButton("9");
         panel.add(n9);
         n9.addActionListener(this);
         div=new JButton("/");
         panel.add(div);
         div.addActionListener(this);

         n4=new JButton("4");
         panel.add(n4);
         n4.addActionListener(this);
         n5=new JButton("5");
         panel.add(n5);
         n5.addActionListener(this);
         n6=new JButton("6");
         panel.add(n6);
         n6.addActionListener(this);
         mul=new JButton("*");
         panel.add(mul);
         mul.addActionListener(this);

         n1=new JButton("1");
         panel.add(n1);
         n1.addActionListener(this);
         n2=new JButton("2");
         panel.add(n2);
         n2.addActionListener(this);
         n3=new JButton("3");
         panel.add(n3);
         n3.addActionListener(this);
         minus=new JButton("-");
         panel.add(minus);
         minus.addActionListener(this);

         dot=new JButton(".");
         panel.add(dot);
         dot.addActionListener(this);
         n0=new JButton("0");
         panel.add(n0);
         n0.addActionListener(this);
         equal=new JButton("=");
         panel.add(equal);
         equal.addActionListener(this);
         plus=new JButton("+");
         panel.add(plus);
         plus.addActionListener(this);
         add(panel,BorderLayout.CENTER);
      }
      public void actionPerformed(ActionEvent ae)
         {
      if(ae.getSource()==n1) assign("1");
      else if(ae.getSource()==n2) assign("2");
      else if(ae.getSource()==n3) assign("3");
      else if(ae.getSource()==n4) assign("4");
      else if(ae.getSource()==n5) assign("5");
      else if(ae.getSource()==n6) assign("6");
      else if(ae.getSource()==n7) assign("7");
      else if(ae.getSource()==n8) assign("8");
      else if(ae.getSource()==n9) assign("9");
      else if(ae.getSource()==n0) assign("0");
      else if(ae.getSource()==dot)
            {
             if(((result.getText()).indexOf("."))==-1)
                result.setText(result.getText()+".");
           }
      else if(ae.getSource()==minus)
             {
             preRes=Double.parseDouble(result.getText());
             lastCommand="-";
             result.setText("0");
             }
      else if(ae.getSource()==div)
             {
             preRes=Double.parseDouble(result.getText());
             lastCommand="/";
             result.setText("0");
             }
      else if(ae.getSource()==equal)
             {
             secVal=Double.parseDouble(result.getText());
             if(lastCommand.equals("/"))
                  res=preRes/secVal;
             else if(lastCommand.equals("*"))
                  res=preRes*secVal;
             else if(lastCommand.equals("-"))
                  res=preRes-secVal;
             else if(lastCommand.equals("+"))
                  res=preRes+secVal;
             result.setText(" "+res);
             lastCommand="=";
             }
      else if(ae.getSource()==mul)
             {
              preRes=Double.parseDouble(result.getText());
              lastCommand="*";
              result.setText("0");
              }
      else if(ae.getSource()==plus)
              {
              preRes=Double.parseDouble(result.getText());
              lastCommand="+";
              result.setText("0");
              }

       }
 }

【问题讨论】:

    标签: java swing jframe calculator


    【解决方案1】:

    对于简单的小程序,应该这样做

    • 扩展 JFrame(显然)
    • 将东西从 init() 移到构造函数中。

      public class Calculator extends JFrame{
      
        public Calculator() {
        CalculatorPanel calc=new CalculatorPanel();
        getContentPane().add(calc);
        addWindowListener(new WindowAdapter() {
      
              public void windowClosing(WindowEvent e) {
                  System.exit(0);
              }
          });
         pack();
         setVisible(true);
        }
      

      }

    【讨论】:

    • 虽然有必要扩展JApplet,但扩展JFrame 既没有必要也不可取(除非代码提供超出标准JFrame 的额外方法)。
    【解决方案2】:

    似乎没有人注意到您的 SSCCE 非常适合成为混合应用程序/小程序。这是因为主 GUI 被编码在 JPanel (CalculatorPanel) 中,然后可以添加到 JAppletJFrame

    要创建混合,请将源代码的第一行更改为:

    // <applet code='Calculator' width='400' height='450'></applet>
    import javax.swing.*;
    import javax.swing.JOptionPane;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Calculator extends JApplet {
       public void init() {
          CalculatorPanel calc=new CalculatorPanel();
          getContentPane().add(calc);
       }
    
       public static void main(String[] args) {
          Runnable r = new Runnable() {
             public void run() {
                JFrame f = new JFrame("Calculator");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new CalculatorPanel());
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
          };
          SwingUtilities.invokeLater(r);
       }
    }
    

    然后,将其编译并作为小程序和应用程序运行,类似于..

    prompt> javac Calculator.java
    prompt> appletviewer Calculator.java  // run the applet
    prompt> java Calculator               // run the application
    

    【讨论】:

      【解决方案3】:

      不要太多

      public class Calculator extends JFrame{   //1
         public void init() {
            CalculatorPanel calc=new CalculatorPanel();
            getContentPane().add(calc);
            this.show();       //2
            }
         }
      

      当然还有一个主要功能...

      【讨论】:

        【解决方案4】:

        糟糕的代码... ;-)

        不管怎样,只要做一些简单的改变,它就可以工作:

        public class Calculator
        {
          public static void main(String[] args)
          {
            // Schedule a job for the event-dispatching thread:
            // creating and showing this application's GUI.
            SwingUtilities.invokeLater(new Runnable()
            {
              public void run()
              {
                JFrame calc = new JFrame();
                CalculatorPanel display = new CalculatorPanel();
                calc.add(display);
                calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                calc.pack();
                calc.setVisible(true);
              }
            });
          }
        
          static class CalculatorPanel extends JPanel implements ActionListener 
          {
            // ...
          }
        }
        

        【讨论】:

          【解决方案5】:

          一种方法是通过以下方式将 JApplet 添加到 JFrame:

              JFrame f=new JFrame();
              f.setSize(x, y);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.setVisible(true);
          
              Calculator calculator=new Calculator();
              calculator.setSize(x, y);
          
              f.add(calculator);
          

          编辑

          Here 是它的教程。

          【讨论】:

          • 不客气。请记住将您认为适合您的任何答案标记为已接受的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多