
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.80] |
![]() |
|
![]() |
|
|
Приветствую многоуважаемый Олл!
Подскажите pls, какие существуют способы построения графиков в JAVA, процедуры, примеры кода (Требуется построить график заранее известной математической функции). ![]() З.Ы. Заранее спасибо за любую инфу по этому вопросу. ![]() |
Сообщ.
#2
,
|
|
|
Посмотри в сторону либы JFreeChart.
|
Сообщ.
#3
,
|
|
|
thanks you
![]() |
Сообщ.
#4
,
|
|
|
В принципе для просто го варианта все может быть гораздо проще. Вот текст программы, которую мне студенты делали. Там правда заполнение векторов данных для графика идет из файла с числами, но никто тебе не мешает сделать заполнение в виде функции.
![]() ![]() import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JFileChooser; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Vector; import java.awt.Graphics; import java.awt.Color; public class Graphik extends JFrame { public static void main(String[] args) { Graphik graphik1 = new Graphik(); graphik1.setDefaultCloseOperation(EXIT_ON_CLOSE); graphik1.setVisible(true); } public Graphik() { JButton btn = new JButton("OTKPbITb"); GraphPanel p = new GraphPanel(); btn.addActionListener(p); getContentPane().add("North", btn); getContentPane().add("Center", p); setBounds(100, 100, 500, 500); } } class GraphPanel extends JPanel implements ActionListener { private Vector vx = new Vector(); private Vector vy = new Vector(); public void paintComponent(Graphics g) { super.paintComponent(g); int xmax = Integer.MIN_VALUE; int xmin = Integer.MAX_VALUE; int ymax = Integer.MIN_VALUE; int ymin = Integer.MAX_VALUE; // Находим максимальные и минимальные значения for (int i = 0; i < vx.size(); i++) { int x = ( (Integer) vx.get(i)).intValue(); int y = ( (Integer) vy.get(i)).intValue(); if (x > xmax) { xmax = x; } if (x < xmin) { xmin = x; } if (y > ymax) { ymax = y; } if (y < ymin) { ymin = y; } } // определяем коэффициенты масштабирования double Kx = (getWidth()-1)/(xmax-xmin); double Ky = (getHeight()-1)/(ymax-ymin); // рисуем for(int i=1; i<vx.size(); i++) { int x0 = ( (Integer) vx.get(i-1)).intValue(); int y0 = ( (Integer) vy.get(i-1)).intValue(); int x1 = ( (Integer) vx.get(i)).intValue(); int y1 = ( (Integer) vy.get(i)).intValue(); g.drawLine((int)Kx*(x0-xmin), (int)Ky*(y0-ymin), (int)Kx*(x1-xmin), (int)Ky*(y1-ymin)); } } public void actionPerformed(ActionEvent e) { // Вот тут ты можешь заполнять вектора vx и vy расчетными данными а не считывать их из файла. JFileChooser f = new JFileChooser(); f.showDialog(this, "Выберите файл"); File fl = f.getSelectedFile(); if (fl == null) { return; } try { vx.clear(); vy.clear(); BufferedReader br = new BufferedReader(new FileReader(fl)); String S = null; while ( (S = br.readLine()) != null) { String[] d = S.split("\\s+"); vx.add(new Integer(d[0])); vy.add(new Integer(d[1])); } } catch (IOException io_e) { } repaint(); } } |
Сообщ.
#5
,
|
|
|
Доброго времени суток!
Возможно ли рисование самого графика осуществить не в paintComponent(Graphics g) а в другой процедуре и сохранить его в память, а в paintComponent(Graphics g) только выводть его? Я пробовал сделать через BufferedImage, но ничего не получилось! |
Сообщ.
#6
,
|
|
|
Цитата Gugle @ Я пробовал сделать через BufferedImage, но ничего не получилось! Что не вышло? |
Сообщ.
#7
,
|
|
|
![]() ![]() import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.geom.Line2D; public class NewClass extends javax.swing.JPanel implements java.awt.event.MouseListener, java.awt.event.MouseMotionListener { public NewClass() { setBackground(_color.WHITE); setForeground(_color.BLUE); addMouseListener(this); addMouseMotionListener(this); setPreferredSize(new Dimension((int)(_endX-_beginX), (int)(_endY-_beginY))); setSize(new Dimension((int)(_endX-_beginX), (int)(_endY-_beginY))); getPoint(); } public void paintComponent(Graphics theGraphics) { super.paintComponent(theGraphics); java.awt.Graphics2D g2 =(java.awt.Graphics2D)theGraphics; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // График java.awt.geom.AffineTransform oldTransform = _gImage.getTransform(); _gImage.scale(_scaleX, _scaleY); //_gImage.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, 0.1F)); _gImage.setPaint(Color.RED); // если убрать коменты то рисуется /*for (int i=0; i < _pointX.length-1; i++) { double x1 = _pointX[i]-_beginX; double y1 = _pointY[i];//-_beginY; double x2 = _pointX[i+1]-_beginX; double y2 = _pointY[i+1];//-_beginY; java.awt.geom.Line2D line = new java.awt.geom.Line2D.Double(x1, y1, x2, y2); //System.out.println(x1 +"/"+ y1 +" "+ x2 +"/"+ y2); _gImage.draw(line); }*/ g2.drawImage(_image, null, 0, 0); _gImage.setTransform(oldTransform); // Ползунок if (_enableSlider) { float[] dashPattern = {10, 10}; g2.setStroke(new BasicStroke( 1.0F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 10.0F, dashPattern, 0)); g2.setPaint(_colorSlider); g2.draw(new Line2D.Double(_mouseX, 0, _mouseX, getHeight())); g2.drawString(String.valueOf(_mouseX), _mouseX, _textSlider); } } public void invalidate() { super.invalidate(); _image = new java.awt.image.BufferedImage( getWidth(), getHeight(), java.awt.image.BufferedImage.TYPE_INT_ARGB); _gImage = _image.createGraphics(); // Если тут прорисовывать Image то графика нет. for (int i=0; i < _pointX.length-1; i++) { double x1 = _pointX[i]-_beginX; double y1 = _pointY[i];//-_beginY; double x2 = _pointX[i+1]-_beginX; double y2 = _pointY[i+1];//-_beginY; java.awt.geom.Line2D line = new java.awt.geom.Line2D.Double(x1, y1, x2, y2); _gImage.draw(line); } //_gImage.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, 0.1F)); _gImage.translate(0, 0); _scaleX = (double)getWidth() / (double)(_endX - _beginX); _scaleY = (double)getHeight() / (double)(_endY - _beginY); //System.out.println(_scaleX); //System.out.println(_scaleY); } // Задаем координаты private void getPoint() { _pointX = new int[_endX - _beginX]; java.util.Random r = new java.util.Random(); _pointY = new int[_endX - _beginX]; for (int i=0; i < _endX - _beginX; i++) { _pointX[i] = i; _pointY[i] = r.nextInt((_endY - _beginY)); } //getGraph(); } public void mouseClicked(MouseEvent e) { _image = new java.awt.image.BufferedImage(1, 1, java.awt.image.BufferedImage.TYPE_INT_ARGB); _gImage = _image.createGraphics(); _gImage.translate(0, (double)getHeight()); this.repaint(); getPoint(); //setGenerateImage(); invalidate(); this.repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { _enableSlider = true; } public void mouseExited(MouseEvent e) { _enableSlider = false; } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { _mouseX = e.getX(); this.repaint(); } // Переменные private Color _color; // Ползунки private boolean _enableSlider = false; private int _mouseX = 0; private int _textSlider = 30; private Color _colorSlider = Color.BLUE; // График private int _beginX = 0; private int _endX = 5000; private int _beginY = 0; private int _endY = 500; private double _scaleX; private double _scaleY; private int[] _pointX = new int[0]; private int[] _pointY = new int[0]; private java.awt.image.BufferedImage _image; private java.awt.Graphics2D _gImage; } При _gImage.draw(line); линии не заносятся в буфер? _image = new java.awt.image.BufferedImage(...) только память освобождает или заносит туда то что на панели? |
Сообщ.
#8
,
|
|
|
Преркасный пример кода построения графиков в Java Java. Графики функций
![]() |