java - 如何在单独的选项卡中管理多个图表上的操作 - jfreechart

标签 java jfreechart

我正在尝试执行一些操作,例如 - 在单独选项卡中的众多图表之一上绘制矩形。实际上,我有绘制矩形和滚动图表的功能,但它仅适用于最后创建的图表。我知道,这是合乎逻辑的,但是如何在其他选项卡中的先前图表上管理这些操作?我可以使用图表面板列表来获取这些数据集并向其中添加新值吗?怎么解决这个问题呢?谁能帮我? SSCCE:

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellRenderer;

import net.miginfocom.swing.MigLayout;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYShapeAnnotation;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.Range;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.Layer;

public class TabbedPaneTEST extends JFrame {

    private JFrame frame;
    public JTabbedPane tabbedPane;
    public JButton btnadd;
    public TabbedPaneTEST okno = this;
    ChartPanel chartpanel;
    XYPlot subplot1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TabbedPaneTEST window = new TabbedPaneTEST();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public TabbedPaneTEST() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);

        btnadd = new JButton("add chart");
        frame.getContentPane().add(btnadd, BorderLayout.NORTH);

        panel = new JPanel();
        frame.getContentPane().add(panel, BorderLayout.SOUTH);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

        btnpr = new JButton("draw rectangle");
        panel.add(btnpr);

        btnkr = new JButton("cursor");
        panel.add(btnkr);

        btnadd.addActionListener(new OtworzOknoWyboruInstruDoWykres(this));
        // ==================================================================================================================================
        // Action listener rectangle
        btnpr.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                try {
                    chartpanel.removeMouseListener(mouselistenerProstokat);
                    chartpanel
                            .removeMouseMotionListener(mousemotionlistenerProstokat);
                    chartpanel.removeMouseListener(mouselistenercursor);
                    chartpanel
                            .removeMouseMotionListener(mousemotionlistenercursor);
                    chartpanel
                            .removeMouseWheelListener(mousewheellistenercursor);
                    chartpanel.setPopupMenu(null);
                } catch (Exception e) {
                }

                flagrectangle = true;

                chartpanel.addMouseListener(mouselistenerProstokat);
                chartpanel.addMouseMotionListener(mousemotionlistenerProstokat);

                currentx = chartpanel.getLocationOnScreen().x;
                currenty = Math.abs(chartpanel.getLocationOnScreen().y
                        - frame.getLocationOnScreen().y);
            }
        });
        // ==================================================================================================================================
        // ==================================================================================================================================
        // Action listener cursor
        btnkr.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                try {
                    chartpanel.removeMouseListener(mouselistenerProstokat);
                    chartpanel
                            .removeMouseMotionListener(mousemotionlistenerProstokat);
                    chartpanel.removeMouseListener(mouselistenercursor);
                    chartpanel
                            .removeMouseMotionListener(mousemotionlistenercursor);
                    chartpanel
                            .removeMouseWheelListener(mousewheellistenercursor);
                    chartpanel.setPopupMenu(null);
                } catch (Exception e) {
                }

                flagrectangle = false;

                chartpanel.addMouseListener(mouselistenercursor);
                chartpanel.addMouseMotionListener(mousemotionlistenercursor);
                chartpanel.addMouseWheelListener(mousewheellistenercursor);

            }
        });
        // ==================================================================================================================================

    }

    class OtworzOknoWyboruInstruDoWykres implements ActionListener {
        private TabbedPaneTEST okno;

        public OtworzOknoWyboruInstruDoWykres(TabbedPaneTEST okno) {
            super();
            this.okno = okno;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            formchild FrameDoInstruWyk = null;
            FrameDoInstruWyk = new formchild();
            FrameDoInstruWyk.setOkno(okno);
        }
    }

    List<ChartPanel> CPlist = new ArrayList<>();

    public void DodajWykresInstrumentu(String string) {

        double[] value = new double[1];
        Random generator = new Random();
        value[0] = generator.nextDouble();
        XYSeries series = new XYSeries("Random Data");
        series.add(1.0, 400.2);
        series.add(5.0, 294.1);
        series.add(4.0, 100.0);
        series.add(12.5, 734.4);
        series.add(17.3, 453.2);
        series.add(21.2, 500.2);
        series.add(21.9, null);
        series.add(25.6, 734.4);
        series.add(30.0, 453.2);
        XYSeriesCollection dataset = new XYSeriesCollection(series);
        String plotTitle = "sometitle";
        String xaxis = "number";
        String yaxis = "value";
        PlotOrientation orientation = PlotOrientation.VERTICAL;
        boolean show = false;
        boolean toolTips = false;
        boolean urls = false;

        JFreeChart chart = ChartFactory.createHistogram(plotTitle, xaxis,
                yaxis, dataset, orientation, show, toolTips, urls);
        subplot1 = (XYPlot) chart.getPlot();
        chartpanel = new ChartPanel(chart) {
            @Override
            public void restoreAutoBounds() {

            }
        };
        chartpanel.setRangeZoomable(false);
        chartpanel.setDomainZoomable(true);
        chartpanel.setDismissDelay(400);
        chartpanel.setZoomTriggerDistance(-1000);
        chartpanel.setMouseZoomable(false);

        CPlist.add(chartpanel);
        tabbedPane.addTab(string, chartpanel);

    }

    private double pointstartxrange;
    private double pointendxrange;
    private double pointstartx;
    private double pointstarty;
    private double pointendx;
    private double pointendy;
    Point pointstart = null;
    Point pointend = null;

    // ==================================================================================================================================
    // mouse listener cursor
    MouseListener mouselistenercursor = new MouseListener() {

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            Point pointstart = e.getPoint();
            Point2D point = chartpanel.translateScreenToJava2D(pointstart);
            Rectangle2D plotArea = chartpanel.getScreenDataArea();

            pointstartxrange = subplot1.getDomainAxis().java2DToValue(
                    point.getX(), plotArea, subplot1.getDomainAxisEdge());
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }
    };

    MouseMotionListener mousemotionlistenercursor = new MouseMotionListener() {

        @Override
        public void mouseMoved(MouseEvent arg0) {
        }

        @Override
        public void mouseDragged(MouseEvent arg0) {
            Point pointstart = arg0.getPoint();
            Point2D point = chartpanel.translateScreenToJava2D(pointstart);
            Rectangle2D plotArea = chartpanel.getScreenDataArea();

            pointendxrange = subplot1.getDomainAxis().java2DToValue(
                    point.getX(), plotArea, subplot1.getDomainAxisEdge());

            double roznica = (pointendxrange - pointstartxrange) * (-1);

            double mini = subplot1.getDomainAxis().getRange().getLowerBound()
                    + roznica / 10;
            double maxi = subplot1.getDomainAxis().getRange().getUpperBound()
                    + roznica / 10;
            double maximumRange = subplot1.getDataRange(
                    subplot1.getDomainAxis()).getUpperBound();
            double minimumRange = subplot1.getDataRange(
                    subplot1.getDomainAxis()).getLowerBound();

            if (mini >= minimumRange - 50D
                    && pointstartxrange <= pointendxrange) {
                Range range = new Range(mini, maxi);
                subplot1.getDomainAxis().setRange(range, true, true);
                pointstartxrange = pointstartxrange + roznica / 10;
                pointendxrange = pointendxrange + roznica / 10;
            } else if (maxi <= maximumRange + 50D
                    && pointstartxrange >= pointendxrange) {
                Range range = new Range(mini, maxi);
                subplot1.getDomainAxis().setRange(range, true, true);
                pointstartxrange = pointstartxrange + roznica / 10;
                pointendxrange = pointendxrange + roznica / 10;
            }

        }
    };
    MouseWheelListener mousewheellistenercursor = new MouseWheelListener() {

        int zoomCounter = 0;

        @Override
        public void mouseWheelMoved(MouseWheelEvent arg0) {

            System.out.println(zoomCounter);

            if (arg0.getWheelRotation() > 0) {
                if (zoomCounter > (-5)) {
                    chartpanel.zoomOutDomain(MouseInfo.getPointerInfo()
                            .getLocation().x, MouseInfo.getPointerInfo()
                            .getLocation().y);
                    zoomCounter = zoomCounter - 1;
                }

            } else if (arg0.getWheelRotation() < 0) {
                if (zoomCounter < 5) {
                    chartpanel.zoomInDomain(MouseInfo.getPointerInfo()
                            .getLocation().x, MouseInfo.getPointerInfo()
                            .getLocation().y);
                    zoomCounter = zoomCounter + 1;
                }

            }
        }
    };
    // ==================================================================================================================================

    // ==================================================================================================================================
    // Drawing rectangle

    private MouseListener mouselistenerProstokat = new MouseListener() {

        @Override
        public void mouseReleased(MouseEvent e) {
            Point2D point = chartpanel.translateScreenToJava2D(e.getPoint());
            Rectangle2D plotArea = chartpanel.getScreenDataArea();

            pointendx = subplot1.getDomainAxis().java2DToValue(point.getX(),
                    plotArea, subplot1.getDomainAxisEdge());
            pointendy = subplot1.getRangeAxis().java2DToValue(point.getY(),
                    plotArea, subplot1.getRangeAxisEdge());

            chartfigura();

            pointstart = null;

        }

        @Override
        public void mousePressed(MouseEvent e) {
            Point2D point = chartpanel.translateScreenToJava2D(e.getPoint());
            Rectangle2D plotArea = chartpanel.getScreenDataArea();

            pointstartx = subplot1.getDomainAxis().java2DToValue(point.getX(),
                    plotArea, subplot1.getDomainAxisEdge());
            pointstarty = subplot1.getRangeAxis().java2DToValue(point.getY(),
                    plotArea, subplot1.getRangeAxisEdge());

            pointstart = e.getPoint();
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

    };
    private MouseMotionListener mousemotionlistenerProstokat = new MouseMotionListener() {

        @Override
        public void mouseMoved(MouseEvent e) {
            pointend = e.getPoint();
        }

        @Override
        public void mouseDragged(MouseEvent arg0) {
            chartpanel.setMouseZoomable(false);
            pointend = arg0.getPoint();
            repaint();
        }

    };
    private boolean flagrectangle;
    private int datasetIndex;

    private Shape createRectangle(double startx, double starty, double endx,
            double endy) {
        Rectangle2D e = new Rectangle2D.Double();
        e.setFrameFromDiagonal(startx, starty, endx, endy);
        return e;
    }

    // ==================================================================================================================================
    // ==================================================================================================================================

    private void chartfigura() {

        float alpha = 0.75f;
        int type = AlphaComposite.SRC_OVER;
        AlphaComposite composite = AlphaComposite.getInstance(type, alpha);

        if (flagrectangle == true) {
            datasetIndex++;
            subplot1.setDataset(datasetIndex,
                    Annotacja("rect", pointstartx, pointstarty));
            XYLineAndShapeRenderer rendererShape = new XYLineAndShapeRenderer();
            rendererShape.setBaseShapesVisible(false);
            Rectangle2D rectangle = (Rectangle2D) createRectangle(pointstartx,
                    pointstarty, pointendx, pointendy);
            rendererShape.addAnnotation(new XYShapeAnnotation(rectangle,
                    new BasicStroke(1.0f), Color.BLACK, new Color(255, 90, 100,
                            128)), Layer.BACKGROUND);
            subplot1.setRenderer(datasetIndex, rendererShape);
        }
    }

    // ==================================================================================================================================

    public XYSeriesCollection Annotacja(final String name, double wartosc1,
            double data1) {
        final XYSeries series = new XYSeries(name);
        series.add(wartosc1, data1);

        return new XYSeriesCollection(series);
    }

    // ==================================================================================================================================

    int currentx;
    int currenty;
    public JPanel panel;
    public JButton btnpr;
    public JButton btnkr;

    // ==================================================================================================================================

    public void paint(Graphics g) {
        super.paint(g);
        g.translate(currentx, currenty);

        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        if (pointstart != null) {
            if (flagrectangle == true) {
                g.setClip(chartpanel.getBounds());
                g.setColor(Color.BLACK);
                ((Graphics2D) g).draw(createRectangle(pointstart.x,
                        pointstart.y, pointend.x, pointend.y));
            }

        }
    }

    // ==================================================================================================================================

}

class formchild extends JFrame {
    public JFrame frame = this;
    public JPanel panel;
    public JPanel panel_1;
    public JTable table;
    public JPanel panel_2;
    public JButton btnOk;
    public JButton btnOK;
    public JScrollPane scrollPane;
    private TabbedPaneTEST okno;
    public JTextField textField;
    JButton button = new JButton();
    public JLabel lblSzukajFrazy;

    public formchild() {

        frame.setMinimumSize(new Dimension(400, 450));
        frame.setPreferredSize(new Dimension(400, 450));

        panel = new JPanel();
        frame.getContentPane().add(panel, BorderLayout.NORTH);
        panel.setLayout(new MigLayout("", "[544px]", "[23px]"));

        panel_1 = new JPanel();
        frame.getContentPane().add(panel_1, BorderLayout.CENTER);
        panel_1.setLayout(new BorderLayout(0, 0));

        panel_2 = new JPanel();
        FlowLayout flowLayout = (FlowLayout) panel_2.getLayout();
        flowLayout.setAlignment(FlowLayout.RIGHT);
        frame.getContentPane().add(panel_2, BorderLayout.SOUTH);

        btnOK = new JButton("OK");
        btnOK.setPreferredSize(new Dimension(70, 23));
        panel_2.add(btnOK);
        btnOK.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                frame.dispose();
                okno = null;
            }
        });

        String[] nazwyKolumn = { "element", "button" };

        String[][] data = new String[10][2];

        for (int i = 0; i < 10; i++) {
            data[i][0] = "a" + i;
            data[i][1] = "add";
        }

        table = new JTable(data, nazwyKolumn);
        table.setAutoCreateRowSorter(true);

        table.getColumn("button").setMaxWidth(70);
        table.getColumn("button").setCellRenderer(new ButtonRenderer());
        table.getColumn("button").setCellEditor(
                new ButtonEditor(new JCheckBox()));
        table.setRowHeight(30);
        scrollPane = new JScrollPane(table);
        panel_1.add(scrollPane, BorderLayout.CENTER);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.out.println(table.getValueAt(table.getSelectedRow(), 0));

                okno.DodajWykresInstrumentu((table.getValueAt(
                        table.getSelectedRow(), 0)).toString());

            }
        });

        frame.validate();
        frame.show();
    }

    public void setOkno(TabbedPaneTEST okno) {
        this.okno = okno;
    }

    class ButtonRenderer extends JButton implements TableCellRenderer {
        public ButtonRenderer() {
            setOpaque(true);
        }

        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            setText((value == null) ? "" : value.toString());
            return this;
        }
    }

    class ButtonEditor extends DefaultCellEditor {
        private String label = "add";

        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
        }

        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int row, int column) {
            label = (value == null) ? "" : value.toString();
            button.setText(label);
            return button;
        }

        public Object getCellEditorValue() {
            return new String(label);
        }
    }
}

最佳答案

您的示例重写了 JFrame 及其 paint() 方法,以替换通常由 ChartPanel 提供的功能。相反,扩展 ChartPanel 并覆盖 paintComponent(),然后您创建的每个面板都将拥有一个具有新功能的图表。

关于java - 如何在单独的选项卡中管理多个图表上的操作 - jfreechart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561988/

相关文章:

java - 扁线代替波浪

label - 如何在 JfreeChart 中包装类别标签

java - 如何使用 iText 在 jFreeChart 中写入西里尔字符

java - 饼图碧 Jade 中项目标签的不同颜色

java - JFreeChart 未出现在 JPanel 上 - 可能与我的代码逻辑有关

java - 为什么刷新实体管理器时数据库没有更新?

java - 从 Postgres 获取的日期不正确

java - 如何过滤 TreeMap<MyKey, Map<Key2,List<Kids>>> ,

今天在 sql 数据库中的 Java INSERT

java - 没有检索到 GPS 更新?代码有问题?