【问题标题】:Java, listener advice, swing comp'sJava,听众建议,摇摆舞曲
【发布时间】:2012-11-22 21:13:43
【问题描述】:

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

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

  1. 如何解决“MyShape 是抽象的,无法实例化”错误?
  2. 关于如何完成我的 if 语句以便我选择的形状链接到我的 Jslider 以便将其值添加到该形状(即方形或圆形类)的任何提示?
  3. 然后我如何将 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 - 我的控制面板

    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);
 }

A广场


    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;
}

}

类 shapeAction 实现 ActionListener{ public void 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());   

【问题讨论】:

  • "如果你能解释一下我需要做的事情,一个简单的菜鸟方法" 1) 问一个问题。 2)检查您的帖子的预览。这些代码清单中有 3/4 没有包含结束 }。帖子可以编辑。
  • 3) 包含更少的代码。我严重怀疑大多数方法的实际实现是否重要。
  • 我已经修复了我的 MyShape ASquare = new ASquare();其余的任何提示?我发现这很难:(

标签: java swing compiler-errors jframe jpanel


【解决方案1】:
  • 你的squareAction 是用来监听所有可能的菜单选择的类(每种形状都有一个),所以它应该命名为ShapeMenuAction 或类似的名称。如果您希望在选择菜单选项时执行ShapeMenuActionactionPerformed,您必须创建它的一个实例并将其添加到每个MenuItem,并在它们上使用addActionListener 方法。否则,什么都不会发生。

在我的框架中:

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 的具体子类。现在你除了实例化一个形状什么都不做,你必须在方法结束之前对对象做一些事情,对吧?在您的 MyControlPanel 中创建一个 setShape 方法并从 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 现在,您可以根据滑块值和所选形状更新您的标签,每次其中一个更改时。

    私有 MyShape 形状; 公共无效集形状(MyShape形状){ this.shape = 形状; 更新标签(); }

【讨论】:

  • 不,你必须在 MyFrame 中添加它,使用 square.addActionListener(new ShapeAction());创建菜单项后。圆形和三角形菜单选项也是如此。
  • 在 MyControlPanel 中创建一个 setShape 方法并从 actionPerformed 中调用它,将新创建的形状传递给它。是 - public setShape(){ } 然后呢?
【解决方案2】:

消息表明MyShapeabstract 所以你不能实例化它:

它被定义为抽象的:

public abstract class MyShape {

这意味着你不能这样做

new MyShape(); //compilation error

永远记住,您不能在 Java 中实例化抽象类和接口。

您可以实例化既不是抽象也不是接口的具体类。

【讨论】:

    【解决方案3】:

    编译器不会说谎——你需要使用具体的类。抽象类类型本身不能被实例化,所以你可以使用这个:

    MyShape aSquare = new ASquare();
    

    但不是这个:

    MyShape aSquare = new MyShape ();
    

    同样,如果你有可用的混凝土圆形和三角形:

    MyShape circle = new MyCircle();
    ...
    MyShape triangle = new MyTriangle();
    

    【讨论】:

      【解决方案4】:

      你可能想写:

         MyShape circle = new ASquare();
         MyShape triangle = new ASquare();
      

      代替:

          MyShape circle = new MyShape();
      

            MyShape triangle = new MyShape();

      如果您尝试为circletriangle 实现新的内联类,您可能需要编写:

         MyShape circle = new MyShape (){
            //implement abstract methods
         }
      
         MyShape triangle = new MyShape (){
            //implement abstract methods
         }
      

      【讨论】:

      • @StevenMcilhone 我想说,将MyControlPanel pane = null; 定义为MyFrame 类中的类变量。通过 getter 方法在 MyControlPanel 中公开 slider。完成后,您将可以访问if 块内的pane,只需获取slider 并添加创建的对象。如果您需要代码示例,请告诉我。
      • 如何向 JMenuItem square = new JMenuItem("Square") 添加一个动作监听器;以便菜单知道正在选择什么形状
      • @StevenMcilhone 在JMenuItem square = new JMenuItem("Square"); 这样的行之后,将侦听器添加为square.addActionListener(new squareAction());。您可以为每个菜单项执行此操作。
      • 谢谢,但这是否意味着我需要向 ASquare 类或 Myshape 添加任何代码?
      • @StevenMcilhone No. ASquare 是真正的班级。即使你说,MyShape triangle = new ASquare();triangle 也只是 ASquare
      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      相关资源
      最近更新 更多