我的问题是,在哪里说“triangle.addActionListener(new ShapeAction());”在我的代码中有一个错误,说找不到ShapeAction符号,我在这里做错了什么?并且有人可以查看我的If语句,它可以执行以下操作:单击一个菜单项后,它会从另一个类创建该形状的实例
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");
square.addActionListener(new ShapeAction());
JMenuItem circle = new JMenuItem("Circle");
circle.addActionListener(new ShapeAction());
JMenuItem triangle = new JMenuItem("Triangle");
triangle.addActionListener(new ShapeAction());
//add shapes to menu
shapes.add(circle);
shapes.add(triangle);
shapes.add(square);
//add the menu
setJMenuBar(topMenu);
MyControlPanel pane = new MyControlPanel();
getContentPane().add(pane);
this.add(pane);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
// <snip>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MyFrame().setVisible(true);
}
});
class ShapeAction implements ActionListener{
public void actionPerformed(ActionEvent e){
JMenuItem clickedMenu = (JMenuItem)e.getSource();
if (clickedMenu.getText().equals("Square")){
//implement abstract methods
MyShape aSquare = new ASquare();
}
else if (clickedMenu.getText().equals("Circle")){
//implement abstract methods
MyShape ACircle = new ACircle();
}
else if (clickedMenu.getText().equals("Triangle")){
//implement abstract methods
MyShape ATriangle = new ATriangle();
}
}
}
}
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 ACircle extends MyShape {
@Override
public double computeBoundaryLength(double Length)
{
thelength=(2*Length*Math.PI);
return thelength;
}
@Override
public double computeArea(double Length)
{
thearea=(Length*Length*Math.PI);
return thearea;
}
}
答案 0 :(得分:3)
您应该在ShapeAction
类的main
方法之外引入内部类MyFrame
。并且您创建了一个本地main
的方法类而不是它。
只需将其移到main
方法之外:
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" );
square.addActionListener ( new ShapeAction () );
JMenuItem circle = new JMenuItem ( "Circle" );
circle.addActionListener ( new ShapeAction () );
JMenuItem triangle = new JMenuItem ( "Triangle" );
triangle.addActionListener ( new ShapeAction () );
//add shapes to menu
shapes.add ( circle );
shapes.add ( triangle );
shapes.add ( square );
//add the menu
setJMenuBar ( topMenu );
MyControlPanel pane = new MyControlPanel ();
getContentPane ().add ( pane );
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 ShapeAction implements ActionListener
{
public void actionPerformed ( ActionEvent e )
{
JMenuItem clickedMenu = ( JMenuItem ) e.getSource ();
if ( clickedMenu.getText ().equals ( "Square" ) )
{
//implement abstract methods
MyShape aSquare = new ASquare ();
}
else if ( clickedMenu.getText ().equals ( "Circle" ) )
{
//implement abstract methods
MyShape ACircle = new ACircle ();
}
else if ( clickedMenu.getText ().equals ( "Triangle" ) )
{
//implement abstract methods
MyShape ATriangle = new ATriangle ();
}
}
}
}
P.S。你忘记了代码末尾的一个结束括号。我在示例中添加了它...