Java 使用更新的JSlider绘制图形

Java 使用更新的JSlider绘制图形,java,swing,graph,event-handling,jslider,Java,Swing,Graph,Event Handling,Jslider,我正在制作一个从用户给出的数学表达式中绘制图形的图示器。此外,该程序有一个滑块和播放按钮,用户可以为滑块及其范围选择一个变量,因此单击播放按钮,滑块将从最小范围开始到最大范围,并绘制图形。 对于计时器,我使用的是a的答案 对于图示器,我使用的是代码。(我专门处理Plotter.java文件) 带有可播放滑块(计时器)代码的已编辑Plotter.java文件: import java.util.*; 公共类绘图仪扩展JFrame实现ActionListener { private JMenu

我正在制作一个从用户给出的数学表达式中绘制图形的图示器。此外,该程序有一个滑块和播放按钮,用户可以为滑块及其范围选择一个变量,因此单击播放按钮,滑块将从最小范围开始到最大范围,并绘制图形。 对于计时器,我使用的是a的答案

对于图示器,我使用的是代码。(我专门处理Plotter.java文件)

带有可播放滑块(计时器)代码的已编辑Plotter.java文件:

import java.util.*;
公共类绘图仪扩展JFrame实现ActionListener
{   
private JMenuBar menuBar=new JMenuBar();
私有JMenu fileMenu=新JMenu(“文件”);
私有JMenuItem openMenuItem=新JMenuItem(“打开”);
private JMenuItem saveMenuItem=新的JMenuItem(“保存”);
私有JMenuItem exitMenuItem=新JMenuItem(“退出”);
私有int值;
私有jcombox eqCombo=新jcombox();
私有JButton addButton、removeButton、clearButton;
私有图;
专用JPanel用户面板、sliderPanel;
私有JSlider滑块_1=新JSlider();
私有JButton playButton=新JButton();
私有JTextField textField=新JTextField();
私人定时器;
私有ImageIcon playIcon=新的ImageIcon(getClass().getResource(“/images/play.png”);
private-ImageIcon pauseIcon=new-ImageIcon(getClass().getResource(“/images/pause.png”);
公共绘图仪(双低、双高、双频、字符串文件)抛出GraphgumentsException、IOException
{
超级(“绘图仪”);
textField.setBounds(266,11,134,28);
textField.setColumns(10);
createNewGraph(低x、高x、频率、文件);
createLayout();
//createsliderpanel();
}
私有void createLayout()引发GraphChargementsException
{
容器c=getContentPane();
设置大小(850600);
getContentPane().setLayout(null);
c、 添加(图形);
c、 添加(用户面板);
JPanel down=新的JPanel();
向下。后退(0437650,119);
getContentPane().add(向下);
down.setLayout(空);
滑块_1.设置值(0);
滑块_1.设置主轨迹间距(5);
滑块1.设置最小旋转间隔(1);
滑块_1.设置油漆标签(真);
滑块_1.设置颜料刻度(真);
滑块1.立根(145,51,467,42);
向下。添加(滑块_1);
playButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
}
});
playButton.setBounds(16,51,117,29);
播放按钮。设置图标(播放图标);
down.add(播放按钮);
down.add(textField);
JPanel panel_1=新的JPanel();
面板1.立根(649、39、201、517);
getContentPane().add(面板1);
面板_1.设置布局(新边界布局(0,0));
//c.添加(滑动面板,边界布局,南部);
createMenuBar();
}
/**
*创建一个新的图形实例,并将公式从文件添加到图形中
*@param eqFile存储公式的文件
*@抛出异常
*/
私有void createNewGraph(双minX、双maxX、双freq、字符串eqFile)抛出GraphgumentsException、IOException
{
方程[]eq=null;
图形=新图形(minX、maxX、freq);
图.立根(0,39,650,396);
eq=从文件(eqFile)读取的等式;
如果(等式!=null)
加法(eq);
图.立根背景(颜色.白色);
userPanel=createUserPanel(eq);
}
私有void createMenuBar()
{
菜单栏。添加(文件菜单);
fileMenu.add(openMenuItem);
添加(saveMenuItem);
fileMenu.addSeparator();
fileMenu.add(exitMenuItem);
openMenuItem.addActionListener(此);
saveMenuItem.addActionListener(此);
exitMenuItem.addActionListener(此);
setJMenuBar(菜单栏);
}
/**
*在GUI顶部创建用户面板,用于添加和编辑功能
*@param eq等式列表添加到组合框中
*@包含按钮和可编辑组合框的返回面板
*/
私有JPanel createUserPanel(等式[]等式)
{
JPanel up=newjpanel(newflowlayout(FlowLayout.LEFT));
上升。后退(0,0,844,39);
eqCombo.setEditable(真);
如果(等式!=null)
{
//将所有方程式添加到组合框中
for(int i=0;i=滑块_1.getMaximum()){
停止锁定();
}否则{
滑块_1.设置值(值);
}
}
});
slider_1.addChangeListener(新的ChangeListener(){
@凌驾
公共无效状态已更改(更改事件e){
textField.setText(Integer.toString(slider_1.getValue());
}
});
滑块_1.设置值(0);
playButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(timer.isRunning()){
停止锁定();
}否则{
启动锁();
}
}
});
如果(例如getSource()==addButton)
addEquation((字符串)eqCombo.getSelectedItem());
else if(例如getSource()==removeButton)
removeEquation(
import java.util.*;


public class Plotter extends JFrame implements ActionListener
{   

private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu = new JMenu("File");
private JMenuItem openMenuItem = new JMenuItem("Open");
private JMenuItem saveMenuItem = new JMenuItem("Save");
private JMenuItem exitMenuItem = new JMenuItem("Exit");
private int value;
private JComboBox eqCombo = new JComboBox();
private JButton addButton, removeButton, clearButton ;
private Graph graph;
private JPanel userPanel , sliderPanel;

private JSlider slider_1 = new JSlider();
private JButton playButton = new JButton();
private JTextField textField = new JTextField();
private Timer timer ;
private ImageIcon playIcon = new ImageIcon(getClass().getResource("/images/play.png"));
private ImageIcon pauseIcon = new ImageIcon(getClass().getResource("/images/pause.png"));

public Plotter(double lowX, double highX, double frequency, String file) throws GraphArgumentsException, IOException
{
    super("Plotter");
    textField.setBounds(266, 11, 134, 28);
    textField.setColumns(10);

    createNewGraph(lowX, highX, frequency, file);
    createLayout();
    //createsliderpanel();
}

private void createLayout() throws GraphArgumentsException
{
    Container c = getContentPane();
    setSize(850,600);
    getContentPane().setLayout(null);
    c.add(graph);
    c.add(userPanel);

    JPanel down = new JPanel();
    down.setBounds(0, 437, 650, 119);
    getContentPane().add(down);
    down.setLayout(null);
    slider_1.setValue(0);
    slider_1.setMajorTickSpacing(5);
    slider_1.setMinorTickSpacing(1);
    slider_1.setPaintLabels(true);
    slider_1.setPaintTicks(true);
    slider_1.setBounds(145, 51, 467, 42);

    down.add(slider_1);
    playButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        }
    });
    playButton.setBounds(16, 51, 117, 29);
    playButton.setIcon(playIcon);
    down.add(playButton);

    down.add(textField);

    JPanel panel_1 = new JPanel();
    panel_1.setBounds(649, 39, 201, 517);
    getContentPane().add(panel_1);
    panel_1.setLayout(new BorderLayout(0, 0));
//  c.add(sliderPanel , BorderLayout.SOUTH);
    createMenuBar();
}



/**
 * Creates a new Graph instance and adds equations from file into Graph
 * @param eqFile file where equations are stored
 * @throws IOException
 */
private void createNewGraph(double minX, double maxX, double freq, String eqFile) throws GraphArgumentsException, IOException
{
    Equation[] eq = null;
    graph = new Graph(minX, maxX, freq);
    graph.setBounds(0, 39, 650, 396);

    eq = readEquationsFromFile(eqFile);

    if (eq != null)
        addEquation(eq);

    graph.setBackground(Color.WHITE);
    userPanel = createUserPanel(eq);
}

private void createMenuBar()
{
    menuBar.add(fileMenu);
    fileMenu.add(openMenuItem);
    fileMenu.add(saveMenuItem);
    fileMenu.addSeparator();
    fileMenu.add(exitMenuItem);
    openMenuItem.addActionListener(this);
    saveMenuItem.addActionListener(this);
    exitMenuItem.addActionListener(this);
    setJMenuBar(menuBar);
}

/**
 * Create user panel at top of the GUI for adding and editing functions
 * @param eq equation list to add into the combo box
 * @return panel containing buttons and an editable combo box
 */
private JPanel createUserPanel(Equation[] eq)
{
    JPanel up = new JPanel(new FlowLayout(FlowLayout.LEFT));
    up.setBounds(0, 0, 844, 39);
    eqCombo.setEditable(true);

    if (eq != null)
    {
        //Add all equations into the combo box
        for (int i = 0; i < eq.length; i++)
            eqCombo.addItem(eq[i].getPrefix());
    }

    addButton = new JButton("Add");
    removeButton = new JButton("Remove");
    clearButton = new JButton("Clear");

    addButton.addActionListener(this);
    removeButton.addActionListener(this);
    clearButton.addActionListener(this);

    up.add(eqCombo);
    up.add(addButton);
    up.add(removeButton);
    up.add(clearButton);


    return up;





}

// slider panel
/*private JPanel createsliderpanel()
{
    JPanel down = new JPanel(new FlowLayout(FlowLayout.LEFT));

    playbutton = new JButton("Play");
    slider = new JSlider();
    field = new JTextField();


    down.add(playbutton);
    down.add(slider);
    down.add(field);


    return down;
}*/



/**
 * Check action lister for button and menu events
 */
public void actionPerformed(ActionEvent e)
{

    timer = new Timer(500, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int value = slider_1.getValue() + 1;
            if (value >= slider_1.getMaximum()) {
                stopTheClock();
            } else {
                slider_1.setValue(value);
            }
        }
    });
    slider_1.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            textField.setText(Integer.toString(slider_1.getValue()));
        }
    });
    slider_1.setValue(0);

    playButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (timer.isRunning()) {
                stopTheClock();
            } else {
                startTheClock();
            }
        }
    });

    if (e.getSource() == addButton)
        addEquation((String)eqCombo.getSelectedItem());

    else if (e.getSource() == removeButton)
        removeEquation(eqCombo.getSelectedIndex());

    else if (e.getSource() == saveMenuItem)
        saveEquationList();

    else if (e.getSource() == openMenuItem)
        loadEquations();

    else if (e.getSource() == clearButton)
        clearEquations();


    else if (e.getSource() == exitMenuItem)
        System.exit(0);
}



/**
 * Save equations to file
 *
 */
private void saveEquationList()
{
    try
    {
        PrintWriter out = new PrintWriter(new FileWriter("myeq.txt"));
        for (int i = 0; i < eqCombo.getItemCount(); i++)
            out.println(eqCombo.getItemAt(i));

        out.close();
    }
    catch (IOException e)
    {
        System.out.println(e);

    }
}


private void clearEquations()
{
    graph.removeAllEquations();
    eqCombo.removeAllItems();
}

/**
 * Load equations from file into graph
 *
 */
private void loadEquations()
{
    String file=null;
    JFileChooser fc = new JFileChooser();

    fc.showOpenDialog(null);
    if (fc.getSelectedFile() != null)
    {
        file = fc.getSelectedFile().getPath();

        try
        {
            Equation[] eq = readEquationsFromFile(file);
            if (eq != null)
            {
                clearEquations();
                addEquation(eq);

                //Restock combo box with new equations
                for (int i = 0; i < eq.length; i++)
                    eqCombo.addItem(eq[i].getPrefix());
            }
        }
        catch (IOException e)
        {
            JOptionPane.showMessageDialog(null, "ERR4: Unable to read or access file", "alert", JOptionPane.ERROR_MESSAGE);
        }
    }
}

/**
 * Add an equation to the Graph
 * @param eq equation
 */
private void addEquation(String eq)
{
    try
    {
        if (eq != null && !eq.equals(""))
        {
            Equation equation = new Equation(eq);
            eqCombo.addItem(eq);
            graph.addEquation(equation);
        }
    }
    catch (EquationSyntaxException e)
    {
        JOptionPane.showMessageDialog(null, "ERR2: Equation is not well-formed", "alert", JOptionPane.ERROR_MESSAGE);
    }
}
/**
 * Add multiple equations to Graph
 * @param eq equation array
 */
private void addEquation(Equation[] eq)
{
    for (int i = 0; i < eq.length; i++)
    {
        graph.addEquation(eq[i]);
    }
}

/**
 * Remove equation from Graph
 * @param index index to remove
 */
private void removeEquation(int index)
{
    if (index >= 0)
    {
        graph.removeEquation(index);
        eqCombo.removeItem(eqCombo.getSelectedItem());
    }
}
// Timer methods
protected void startTheClock() {
    slider_1.setValue(0);
    timer.start();
    playButton.setIcon(pauseIcon);;
}

protected void stopTheClock() {
    timer.stop();
    playButton.setIcon(playIcon);
}


/**
 * Read file and extract equations into an array. Any errors on an equation halt the loading of the entire file
 * @param file name of file containing equations
 * @return array of equations
 * @throws IOException
 */
public Equation[] readEquationsFromFile(String file) throws IOException
{
    ArrayList<Equation> eqList = new ArrayList<Equation>(20);

    if (file == null)
        return null;

    String line;
    int lineCount = 1;
    try
    {
        BufferedReader br = new BufferedReader(new FileReader(file));
        while ((line = br.readLine()) != null)
        {
            Equation eq = new Equation(line);
            eqList.add(eq);
            lineCount++;
        }
        br.close();
        return ((Equation[])(eqList.toArray(new Equation[0])));
    }
    catch (EquationSyntaxException e)
    {
        JOptionPane.showMessageDialog(null, "ERR2.1: Equation on line " + lineCount + " is not well-formed", "alert", JOptionPane.ERROR_MESSAGE);
        return null;
    }
}






/**
 * Set up Plotter object and draw the graph.
 * @param args command line arguments for Plotter
 */
public static void main(String[] args)
{
    Scanner s = new Scanner(System.in);

    String expr     = JOptionPane.showInputDialog("Enter your expression");
    String maxInput = JOptionPane.showInputDialog("Enter max value of x");
    String minInput = JOptionPane.showInputDialog("Enter min value of x");

    double frequency = 0.01;
    double maxX = Double.parseDouble(maxInput);
    double minX = Double.parseDouble(minInput);

    String eqFile = null;
        try
    {
        ///double minX = Double.parseDouble(args[0]);
    //  double maxX = Double.parseDouble(args[1]);
    //  double frequency = Double.parseDouble(args[2]);
        //double minX = -10; 
        //double maxX = 10; 
        //double frequency = 0.01;

        if (args.length > 3)
            eqFile = args[3];   

        Plotter plotterGUI = new Plotter(minX, maxX, frequency, eqFile);
        plotterGUI.setVisible(true);
        plotterGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    catch (NumberFormatException e)
    {
        System.out.println("ERR: Invalid arguments");
    }
    catch (GraphArgumentsException e)
    {
        System.out.println(e.getMessage());
    }
    catch (IOException e)
    {
        System.out.print("ERR4: Unable to read or access file");
    }

   }
}
      import javax.swing.*;
      import javax.swing.event.ChangeEvent;
      import javax.swing.event.ChangeListener;


  class demo extends JFrame
{
JFrame f=new JFrame("G");
JSlider slide=new JSlider();
JTextField field=new JTextField();
JTextField d=new JTextField();
final double value=0;

 demo()
{
    setSize(500,500);

    f.setSize(600,600);
    f.setVisible(true);


    slide.setBounds(100,100,200,50);
    field.setBounds(150,150,100,30);
    d.setBounds(0,0,0,0);

    add(slide);
    add(field);
    add(d);
}


 public static void main(String args[])
          {
            demo m=new demo();
            m.setVisible(true);
            m.setLocationRelativeTo(null);
            m.slidec();



              }

public double slidec()
{
    slide.addChangeListener(new ChangeListener() {
     public void stateChanged(ChangeEvent e) {


      double value=((JSlider)e.getSource()).getValue();
      field.setText(Double.toString(value));

     }

    });
    return value;
     }






}