читать размер XYPlot после каждого изменения в ChartPanel - PullRequest
0 голосов
/ 06 марта 2012

Вы знаете, что для ChartPanel существует метод getPreferredSize. Я хочу подобный метод для XYPlot. Поскольку у меня есть фоновое изображение, я буду масштабировать изображение для каждого изменения размера графика в ChartPanel. Ширина XYPLot для меня не важна. Я хочумасштабировать высоту фона.Поэтому мне нужно иметь размер XYPlot.

Изменения могут быть изменениями размера Windows, также вы знаете, что размер XYPlot зависит от элементов domainAxis, элементов Legend.

PS: я знаю, что могучитать информацию о графике в ChartEvent. Я хочу иметь координаты без события мыши триггера.

РЕДАКТИРОВАТЬ: я создаю панель со следующим кодом. Другой класс вызывает этот метод, затем добавляет JPanel с ChartPanel в JFrame

public void createPanel() {

    XYPlot historyPlot = createHistoryPlot();
    /** read forecast result job specific */

    /** Creates future XYPlot */
    XYPlot futurePlot = createFuturePlot();
    /** range axis for CombinedRangeXYPlot */
    final ValueAxis rangeAxis = new NumberAxis("");
    CombinedRangeXYPlot plot = new CombinedRangeXYPlot(rangeAxis);
    /** add subplot to plot */
    plot.setGap(0);
    plot.add(historyPlot, 1);
    plot.add(futurePlot, 1);
    /** Creates new plot includes combinedRange plot */
    chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
    panel = new ChartPanel(chart, true, true, true, false, true);
    /** not enable zoom */
    panel.setDomainZoomable(false);
    panel.setRangeZoomable(false);
    panel.validate();
    panel.setVisible(true);
    this.add(panel, BorderLayout.CENTER);

}

Затем я пытаюсь настроить график с помощью следующего кода. Он вызывается внешним классом после вызова метода createPanel. Поэтому ChartPAnel создается с вложенными участками в нем.

/**
 * Customizes graph view.Changes view related settings.
 * @param chart
 *            JFreeChart instance
 */
private void customizeGraphView(JFreeChart chart) {
    CombinedRangeXYPlot combinedPlot = (CombinedRangeXYPlot) chart.getPlot();
    @SuppressWarnings("unchecked")
    /** read 2 subplot*/
    List<XYPlot> subPlots = combinedPlot.getSubplots();
    for (int plotIndex = 0; plotIndex < subPlots.size(); plotIndex++) {
        /** get plot */
        XYPlot plot = subPlots.get(plotIndex);
        /** do not show domain grid lines */
        plot.setDomainGridlinesVisible(false);
        XYItemRenderer itemRenderer = plot.getRenderer();
        /** if line and shape renderer */
        if (itemRenderer instanceof StandardXYItemRenderer) {
            StandardXYItemRenderer renderer = (StandardXYItemRenderer) itemRenderer;
            /** show shapes in time series */
            renderer.setBaseShapesVisible(true);
            /** fill shapes in time series */
            renderer.setBaseShapesFilled(true);
            renderer.setBaseFillPaint(Color.BLACK);
            // addItemLabels(renderer);
        }
        /** add severity bar for BackGround image for 2 subplot */
        if (plotIndex == 0) {
            addBackGroundImage(plot, Align.RIGHT);
        } else {
/** returns java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=0.0,h=0.0] */

            panel.getScreenDataArea()
            addBackGroundImage(plot, Align.LEFT);
        }
        plot.setOutlineVisible(false);
    }

}

1 Ответ

1 голос
/ 07 марта 2012

Похоже, drawBackgroundImage() делает это для вас, когда вы используете setBackgroundImage(). Если нет, вы можете переопределить drawBackground(), чтобы изменить существующее поведение.

Добавление: параметр Rectangle2D, отправляемый на drawBackground(), должен предоставлять нужную геометрию.

Добавление: этот пример, который переопределяет drawBackground() показывает график Rectangle2D. Обратите внимание, что ChartPanel наследует макет по умолчанию JPanel, то есть FlowLayout.

Консоль

java.awt.Rectangle[x=8,y=28,width=664,height=388]

Код:

public Test() {
    Image image = null;
    try {
        image = ImageIO.read(new File("image.jpg"));
    } catch (IOException ex) {
        ex.printStackTrace(System.err);
    }
    XYPlot plot = new XYPlot() {

        @Override
        public void drawBackground(Graphics2D g2, Rectangle2D area) {
            super.drawBackground(g2, area);
            System.out.println(area);
        }
    };
    plot.setBackgroundImage(image);
    JFreeChart chart = new JFreeChart("Test", plot);
    ChartPanel panel = new ChartPanel(chart);
    this.add(panel);
}
...