感谢您为我看这个,这是我的问题:
我的MyFrame类中的If语句说“MyShape是抽象的,无法实例化”
我也不知道如何完成我的 Action 监听器,以便它创建我从jmenu中选择的形状的实例。最后将我的Jslider的尺寸设置为正方形的大小和面积,并将其添加到JtextField中。
我很乐意为您提供任何帮助,如果可以的话,请解释一下我需要做什么,这对于像我这样的编程新手来说很容易理解:)
我的框架
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
或类似的名称。如果希望在选择菜单选项时执行ShapeMenuAction
的actionPerformed
,则已创建了该实例的一个实例,并将其添加到每个带有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();