感谢您为我看这个,这是我的问题:

我的MyFrame类中的If语句说“MyShape是抽象的,无法实例化”
我也不知道如何完成我的 Action 监听器,以便它创建我从jmenu中选择的形状的实例。最后将我的Jslider的尺寸设置为正方形的大小和面积,并将其添加到JtextField中。

  • 如何解决错误“MyShape是抽象的,无法实例化”?
  • 关于如何完成我的if语句的任何技巧,以便我选择的形状链接到我的Jslider,以便将其值添加到该形状,即正方形或圆形类?
  • 然后我如何将2种方法放到查找该类的长度和面积上,即将正方形或圆形添加到2个Jtext字段?

  • 我很乐意为您提供任何帮助,如果可以的话,请解释一下我需要做什么,这对于像我这样的编程新手来说很容易理解:)

    我的框架
        package assignment;
    
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import javax.swing.JMenu;
        import javax.swing.JMenuBar;
        import javax.swing.JMenuItem;
    
    
        public class MyFrame extends javax.swing.JFrame {
    
    
        public MyFrame() {
    
    
        // Create the menu
        JMenuBar topMenu = new JMenuBar();
        this.setJMenuBar(topMenu);
    
        //create the menu button "shapes"
        JMenu shapes = new JMenu("Shapes");
        topMenu.add(shapes);
        //Create the 3 shapes for the menu
        JMenuItem square = new JMenuItem("Square");
    
        JMenuItem circle = new JMenuItem("Circle");
        JMenuItem triangle = new JMenuItem("Triangle");
    
        //add shapes to menu
        shapes.add(circle);
        shapes.add(triangle);
        shapes.add(square);
    
        //add the menu
        setJMenuBar(topMenu);
    
    
        MyControlPanel pane = new MyControlPanel();
        this.add(pane);
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    
        pack();
        }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
    
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyFrame().setVisible(true);
            }
        });
    
        class squareAction implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
    
                JMenuItem clickedMenu = (JMenuItem) e.getSource();
                if (clickedMenu.getText().equals("Square")) {
                    MyShape ASquare = new MyShape() {
                    };
                } else if (clickedMenu.getText().equals("Circle")) {
                    MyShape Circle = new MyShape();
                } else if (clickedMenu.getText().equals("Triangle")) {
                    MyShape Triangle = new MyShape();
                }
            }
        }
        }
        }
    

    Jpanel-MyControlPanel
        package assignment;
    
        //import java.awt.FlowLayout;
        import java.awt.BorderLayout;
        import java.awt.FlowLayout;
        import javax.swing.GroupLayout;
        import javax.swing.GroupLayout.Alignment;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        import javax.swing.JSlider;
        import javax.swing.JTextField;
        import javax.swing.event.ChangeEvent;
        import javax.swing.event.ChangeListener;
    
        public class MyControlPanel extends javax.swing.JPanel {
    
    JSlider slider;
    JLabel sliderLabel;
    JLabel sliderdimension;
    JLabel blank;
    JLabel dl;
    JLabel area1;
    
    /**
     * Creates new form MyControlPanel
     */
    public MyControlPanel() {
    
    
        slider = new JSlider();
        slider.setValue(50);
        slider.addChangeListener(new MyChangeAction());
        slider.setMajorTickSpacing(10);
        slider.setPaintLabels(true);
        slider.setPaintTicks(true);
        slider.setBounds(300, 50, 100, 50);
    
        sliderLabel = new JLabel("50");
        blank = new JLabel("     ");
        sliderdimension = new JLabel("Shape Dimension:");
    
        JTextField boundary_length = new JTextField("Boundary Length");
        JTextField area = new JTextField("Area");
    
        dl = new JLabel("Boundary Length =");
        area1 = new JLabel("Area =");
    
        setLayout(new BorderLayout());
    
    
        JPanel sliderPanel = new JPanel();
        sliderPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));
    
    
        sliderPanel.add(sliderdimension);
        sliderPanel.add(sliderLabel);
        sliderPanel.add(slider);
        sliderPanel.add(dl);
        sliderPanel.add(boundary_length);
        sliderPanel.add(area1);
        sliderPanel.add(area);
        this.add(sliderPanel, BorderLayout.PAGE_END);
    
    
    
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
    
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>
    // Variables declaration - do not modify
    // End of variables declaration
    
    public class MyChangeAction implements ChangeListener {
    
        //complete code here
        public void stateChanged(ChangeEvent ce) {
            int value = slider.getValue();
            String str = Integer.toString(value);
            sliderLabel.setText(str);
    
    
        }
        } // end class
        }
    

    我的形状
        package assignment;
    
        public abstract class MyShape
     {
    
    double thelength;
    double thearea;
    
    
    
    public abstract double computeBoundaryLength(double Length);
    
    public abstract double computeArea (double Length);
     }
    

    一个正方形
        package assignment;
    
        public class ASquare extends MyShape {
    
    @Override
    public double computeBoundaryLength(double Length)
    {
        thelength=(4*Length);
        return thelength;
    }
    
    @Override
    public double computeArea(double Length)
    {
        thearea=(Length*Length);
        return thearea;
    }
    
    }
    

    class ShapeAction实现ActionListener {
    公共(public)无效actionPerformed(ActionEvent e){
                JMenuItem clickedMenu = (JMenuItem)e.getSource();
                if (clickedMenu.getText().equals("Square")){
                     //implement abstract methods
                MyShape ASquare = new ASquare();
                ASquare.addActionListener(new shapeAction());
                }
                else if (clickedMenu.getText().equals("Circle")){
                     //implement abstract methods
                    MyShape ACircle = new ACircle();
                ACircle.addActionListener(new shapeAction());
                }
                else if (clickedMenu.getText().equals("Triangle")){
                     //implement abstract methods
                    MyShape ATriangle = new ATriangle();
                ATriangle.addActionListener(new shapeAction());
    

    最佳答案

  • 您的squareAction应该是侦听所有可能的菜单选择的类(每种形状一个),因此应将其命名为ShapeMenuAction或类似的名称。如果希望在选择菜单选项时执行ShapeMenuActionactionPerformed,则已创建了该实例的一个实例,并将其添加到每个带有MenuItem方法的addActionListener中。否则,将不会发生任何事情。

  • 在MyFrame中:
    JMenuItem square = new JMenuItem("Square");
    square.addActionListener(new ShapeAction());
    JMenuItem circle = new JMenuItem("Circle");
    circle.addActionListener(new ShapeAction());
    JMenuItem triangle = new JMenuItem("Triangle");
    triangle.addActionListener(new ShapeAction());
    
  • actionPerformed中,您必须实例化MyShape的具体子类。现在,除了实例化形状外,您什么都没有做,您必须在方法结束之前对对象进行某些操作,对吗?在setShape中创建一个MyControlPanel方法,然后从actionPerformed调用它,并将新创建的形状传递给它。

  • 在ShapeAction中:
        public void actionPerformed(ActionEvent e) {
           JMenuItem clickedMenu = (JMenuItem) e.getSource();
           if (clickedMenu.getText().equals("Square")) {
               MyShape aSquare = new ASquare();
               myControlPanel.setShape(aSquare);
           } else if (clickedMenu.getText().equals("Circle")) {
               MyShape aCircle = new ACircle();
               myControlPanel.setShape(aCircle);
           } else if (clickedMenu.getText().equals("Triangle")) {
               MyShape aTriangle = new MyShape();
               myControlPanel.setShape(aTriangle);
           }
        }
    

    您必须在MyFrame中创建一个名为myControlPanel的MyControPanel:
    private MyControlPanel myControlPanel
    

    并添加
    myControlPanel = new MyControlPanel();
    getContentPane().add(myControlPanel);
    

    之前
    pack();
    
  • 现在,在MyControlPanel中,您可以根据滑块值和所选形状(每次更改其中之一)来更新标签。

    私有(private)MyShape形状;
    公共(public)无效集Shape(MyShape shape){
    this.shape =形状;
    updateLabels();
  • 10-08 19:48