gpt4 book ai didi

java - 每次更改 ChartPanel 后读取 XYPlot 大小

转载 作者:行者123 更新时间:2023-12-01 15:30:27 25 4
gpt4 key购买 nike

您知道 ChartPanel 存在 getPreferredSize 方法。我想要 XYPlot 的类似方法。因为我有背景图像,我将为 ChartPanel 中的每个绘图大小更改缩放图像。XYPLot 宽度对我来说并不重要。我想缩放背景高度。所以我需要 XYPlot 的大小。

更改可以是 Windows 调整大小更改,您也知道 XYPlot 大小受domainAxis 项目、Legend 项目的影响。

P.S:我知道我可以在 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);
}

}

最佳答案

看起来像drawBackgroundImage()当您使用 setBackgroundImage() 时,会为您执行此操作。如果没有,您可以覆盖 drawBackground()改变现有的行为。

附录:发送到 drawBackground()Rectangle2D 参数应该提供您想要的几何图形。

附录:此示例覆盖 drawBackground()显示绘图的 Rectangle2D。请注意,ChartPanel 继承了 JPanel 的默认布局,即 FlowLayout

控制台:

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

Code:

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);
}

关于java - 每次更改 ChartPanel 后读取 XYPlot 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9582631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com