【问题标题】:jfreechart each plot in JSplitPanejfreechart JSplitPane 中的每个绘图
【发布时间】:2014-05-18 05:24:33
【问题描述】:

有没有人用 JSplitPane 中的每个图而不是一个 JPanel 中的所有图实现了 CombinedXYPlot 类型的图? 这样,可以在不影响其他地块的情况下修改每个地块的其中一个大小尺寸(例如,如果每个地块位于拆分窗格中,则使用 CombinedXYPlotDemo4,可以通过拖动 JSplitPane 分隔线手动调整每个地块的垂直高度)。

示例代码如下:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JSplitPane;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class SplitPaneCharts extends JFrame {

    private static final int dataPoints = 100;

    public SplitPaneCharts() {
        super();
        this.getContentPane().setLayout(new FlowLayout());
        Panel panel1 = new Panel();
        ChartPanel chartPanel1 = createDemoPanel("Chart1");
        panel1.add(chartPanel1);
        Panel panel2 = new Panel();
        ChartPanel chartPanel2 = createDemoPanel("Chart2");
        panel2.add(chartPanel2);
        XYPlot plot1 = chartPanel1.getChart().getXYPlot();
        XYPlot plot2 = chartPanel2.getChart().getXYPlot();
        plot2.setDomainAxis(plot1.getDomainAxis());
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
        this.getContentPane().add(splitPane);

    }

    private ChartPanel createDemoPanel(String title) {
        JFreeChart jfreechart = ChartFactory.createXYLineChart(title, "X", "Y", createSampleData(),
            PlotOrientation.VERTICAL, true, true, false);
        XYPlot xyPlot = (XYPlot) jfreechart.getPlot();
        xyPlot.setDomainCrosshairVisible(true);
        xyPlot.setRangeCrosshairVisible(true);
        XYItemRenderer renderer = xyPlot.getRenderer();
        renderer.setSeriesPaint(0, Color.red);
        NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
        domain.setRange(0.00, 1.00);
        domain.setTickUnit(new NumberTickUnit(0.2));
        domain.setVerticalTickLabels(true);
        NumberAxis range = (NumberAxis) xyPlot.getRangeAxis();
        range.setRange(0.0, 1.0);
        range.setTickUnit(new NumberTickUnit(0.2));
        return new ChartPanel(jfreechart);
    }

    private XYDataset createSampleData() {
        XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
        XYSeries series = new XYSeries("Data");
        Random rand = new Random();
        for (int i = 0; i < dataPoints; i++) {
            double x = rand.nextDouble();
            double y = rand.nextDouble();
            series.add(x, y);
        }
        xySeriesCollection.addSeries(series);
        return xySeriesCollection;
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SplitPaneCharts splitPaneCharts = new SplitPaneCharts();
                splitPaneCharts.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                splitPaneCharts.pack();
                splitPaneCharts.setLocationRelativeTo(null);
                splitPaneCharts.setVisible(true);
            }
        });
    }
}

我遇到的几个问题:

1) 当窗格的面积小于绘图时,图表不会调整大小。

2) 移动 JSplitPane 分隔线后,弹出菜单有时会隐藏/不显示在 RMB 上。

3) 理想情况下,我希望将 X 轴放在自己的单独窗格中,并在另外两个窗格中显示数据(即 3 x SplitPanes)。事实证明,这很难解决如何实现 - 我研究了一个 XYPlot,我将 dataArea 设置为一条细水平线 - 因此只绘制 X 轴。但至于如何最好地实现这一点我不确定。

【问题讨论】:

  • “有没有人在 JSplitPane 中实现了组合XYPlot 类型的图,而不是在一个 JPanel 中的所有图?”是的。如果您想知道如何发布您尝试过的内容以及为什么它不起作用。

标签: java swing layout jfreechart jsplitpane


【解决方案1】:
  1. 要让图表随框架调整大小,请指定忽略图表首选大小的布局,例如GridLayout 和框架的BorderLayout.CENTER;不要不必要地嵌套面板。

    ChartPanel chartPanel1 = createDemoPanel("Chart1");
    ChartPanel chartPanel2 = createDemoPanel("Chart2");
    XYPlot plot1 = chartPanel1.getChart().getXYPlot();
    XYPlot plot2 = chartPanel2.getChart().getXYPlot();
    plot2.setDomainAxis(plot1.getDomainAxis());
    chartPanel1.setLayout(new GridLayout());
    chartPanel2.setLayout(new GridLayout());
    JSplitPane splitPane = new JSplitPane(
        JSplitPane.VERTICAL_SPLIT, chartPanel1, chartPanel2);
    add(splitPane, BorderLayout.CENTER);
    
  2. 上下文菜单似乎适用于GridLayout

  3. 您可以尝试CombinedDomainXYPlot,图示为here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多