Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在单独的选项卡中管理多个图表上的操作-jfreechart_Java_Jfreechart - Fatal编程技术网

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

Java 如何在单独的选项卡中管理多个图表上的操作-jfreechart,java,jfreechart,Java,Jfreechart,我正在尝试执行一些操作,例如,在多个图表中的一个单独选项卡上绘制矩形。实际上,我有绘制矩形和滚动图表的功能,但它只适用于最后创建的图表。我知道,这是合乎逻辑的,但如何管理其他选项卡中以前图表上的这些操作?我可以使用图表面板列表来获取这些数据集并为其添加新值吗?如何解决这个问题?有人能帮我吗? SSCCE: 导入java.awt.AlphaComposite; 导入java.awt.BasicStroke; 导入java.awt.BorderLayout; 导入java.awt.Color; 导入

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

导入java.awt.AlphaComposite;
导入java.awt.BasicStroke;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.MouseInfo;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.Shape;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.event.mouseweelEvent;
导入java.awt.event.MouseWheelListener;
导入java.awt.geom.Point2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.BoxLayout;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTabbedPane;
导入javax.swing.JTable;
导入javax.swing.JTextField;
导入javax.swing.table.TableCellRenderer;
导入net.miginfocom.swing.MigLayout;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.annotations.xyshapeanotation;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
导入org.jfree.data.Range;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
导入org.jfree.ui.Layer;
公共类TabbedPaneTEST扩展了JFrame{
私有JFrame;
公共JTabbedPane选项卡窗格;
公共按钮btnadd;
公共选项卡panetest okno=this;
图表面板图表面板;
XYPlot子图1;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
TabbedPaneTEST window=新的TabbedPaneTEST();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共选项卡panetest(){
初始化();
}
私有void初始化(){
frame=新的JFrame();
机架立根(100450300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tabbedPane=新的JTabbedPane(JTabbedPane.TOP);
frame.getContentPane().add(选项卡窗格,BorderLayout.CENTER);
btnadd=新的JButton(“添加图表”);
frame.getContentPane().add(btnadd,BorderLayout.NORTH);
panel=新的JPanel();
frame.getContentPane().add(面板,BorderLayout.SOUTH);
panel.setLayout(新的BoxLayout(panel,BoxLayout.X_轴));
btnpr=新的JButton(“绘制矩形”);
面板。添加(btnpr);
btnkr=新的JButton(“光标”);
面板。添加(btnkr);
btnadd.addActionListener(新的OtworzOknoWyboruInstruDoWykres(this));
// ==================================================================================================================================
//动作侦听器矩形
btnpr.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
试一试{
chartpanel.移除MouseStener(MouseStenerProstokat);
图表面板
.removeMouseMotionListener(MousemotionListenerProtokat);
chartpanel.RemoveMouseStener(MouseStenerCursor);
图表面板
.removeMouseMotionListener(mousemotionlistenercursor);
图表面板
.removeMouseWheelListener(mousewheellistenercursor);
chartpanel.setPopupMenu(空);
}捕获(例外e){
}
flagrectangle=true;
chartpanel.AddMouseStener(MouseStenerProstokat);
chartpanel.addMouseMotionListener(MouseMotionListenerProtokat);
currentx=chartpanel.getLocationOnScreen().x;
currenty=Math.abs(chartpanel.getLocationOnScreen().y
-frame.getLocationOnScreen().y);
}
});
// ==================================================================================================================================
// ==================================================================================================================================
//动作侦听器游标
addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件arg0){
试一试{
chartpanel.移除MouseStener(MouseStenerProstokat);
图表面板
.removeMouseMotionListener(MousemotionListenerProtokat);
chartpanel.RemoveMouseStener(MouseStenerCursor);
图表面板
.removeMouseMotionListener(mousemotionlistenercursor);
图表面板
.removeMouseWheelListener(mousewheellistenercursor);
chartpanel.setPopupMenu(空);
}捕获(例外e){
}
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);
        }
    }
}