我的Java摇摆遇到了严重的问题。
这就是初始化图表的方式,现在一切似乎都很好,在字段中将xyChartPanel
声明为JPanel
,然后使用刚刚创建的xyChart
对其进行初始化。完成此步骤后,我可以看到图表(绘制到xyChartPanel
)居中于正在编写代码的JPanel
上,请参见add(xyChartPanel, BorderLayout.CENTER);
。
private void initXYChart() {
// Create Chart
xyChart = new XYChartBuilder().width(800).height(800).xAxisTitle(xColName).yAxisTitle("Y").build();
// Customize Chart
xyChart.getStyler().setLegendPosition(LegendPosition.InsideNE);
xyChart.getStyler().setAxisTitlesVisible(true);
xyChart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Line);
double[] yCoordArray = new double[xCoordArray.length];
// Loop through the series
for (int i = 0; i < yCoordinates.size(); i++) {
List<Double> yCoordOneSeries = yCoordinates.get(i);
// Convert list to array
for (int j = 0; j < yCoordArray.length; j++) {
yCoordArray[j] = yCoordOneSeries.get(j);
}
xyChart.addSeries(yColNames.get(i), xCoordArray, yCoordArray);
}
xyChartPanel = new XChartPanel<>(xyChart);
add(xyChartPanel, BorderLayout.CENTER);
xyChart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Area);
add(xyChartPanel, BorderLayout.CENTER);
}
现在问题来了,我不想我的图表一直保持不变,实际上我想根据我对单选按钮的操作更改图表的样式。
我刚刚写了
updateChartPanelStyle(JRadioButton styleButton)
方法private void updateChartPanelStyle(JRadioButton styleButton) {
String style = styleButton.getText();
if (styleButton.isSelected()) {
System.out.println(style);
switch (style) {
case "Line":
xyChart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Line);
break;
case "Area":
xyChart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Area);
break;
case "Scatter":
xyChart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Scatter);
}
xyChartPanel = new XChartPanel<>(xyChart);
add(xyChartPanel, BorderLayout.CENTER);
}
}
在此方法中,我更改了在上一个函数中初始化的
xyChart
的样式,并重新初始化了xyChartPanel
,然后将更新后的xyChartPanel
添加到工作面板中。有趣的是,我的GUI没有任何变化。我认为这可能是我的xyChart
问题,其样式之后无法更改。但是事实并非如此。即使我用
xyChartPanel
“删除”了this.remove(xyChartPanel);
,GUI似乎也没有改变。这真的很奇怪,我现在该怎么办?
最佳答案
每次添加/删除要动态摆动的组件时,都需要先调用revalidate();
,然后在JPanel(或直接添加到JFrame的JFrame)上调用repaint();
。