我试图获取我的jslider的值并输入它,以便它是在我的第一段代码中创建的if语句中创建的每个形状的边界长度和面积的值,然后用答案更新我的2个jtextfields边界长度和面积,如何做到这一点的任何提示?
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;
}
}
最佳答案
创建您的textfields类变量,并将这两行放在您的stateChanged
方法中:
boundary_length.setText(str);
area.setText(str);
另外,请确保创建具有固定列数的文本字段,以使它们不会根据显示的文本而改变长度。
更新
我对您的代码进行了一些更改,以将滑块的值传递给您的自定义形状:
MyControlPanel
成为MyFrame
的内部类文本字段成为
MyControlPanel
的类变量滑块成为
MyFrame
的类变量,因此可以在ShapeAction
中访问其值。样例代码:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MyFrame extends javax.swing.JFrame {
JSlider slider;
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("Circle")){
int value = slider.getValue();
MyShape ACircle = new ACircle(value);
}
}
}
public class MyControlPanel extends javax.swing.JPanel {
JLabel sliderLabel;
JLabel sliderdimension;
JLabel blank;
JLabel dl;
JLabel area1;
JTextField boundary_length = new JTextField("Boundary Length");
JTextField area = new JTextField("Area");
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:");
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);
}
public class MyChangeAction implements ChangeListener {
public void stateChanged(ChangeEvent ce) {
int value = slider.getValue();
String str = Integer.toString(value);
sliderLabel.setText(str);
boundary_length.setText(str);
area.setText(str);
}
}
}
}
您还应该在形状类(例如
ACircle
)中添加一个构造器,该构造器将滑块的值作为输入(在其他方法中随意使用)public class ACircle extends MyShape {
int value;
public ACircle(int value) {
this.value = value;
}
// other methods
}