更改元素时框架错误更新
frame incorrectly updates when changing an element
我想在发生某些操作事件(单击按钮)后更改我的一些 JFrame 组件(JPanel、ChartPanel)。下面是一个具体的例子:
最初我的框架是空的(只有菜单栏,没有任何其他面板)。我正在单击菜单 'file > open',选择一个文件,这里变成了一个图表。之后为了清楚起见,我调整了框架的大小。一切都很完美。但接下来我再次单击选择文件以获取新图表,而不是我的图表未正确更新:
here is an illustration of problem
这是我的代码:
public MenuBarDataAnalyser() {
JMenu menuFile = new JMenu("File");
itmOpen = new JMenuItem("Open...");
itmOpen.addActionListener(this);
add(menuFile);
menuFile.add(itmOpen);
}
@Override
public void actionPerformed(ActionEvent e) {
if(source == itmOpen){
final JFileChooser fch = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter("FITS file", "fits");
fch.setFileFilter(filter);
int response = fch.showOpenDialog(itmOpen);
if (response == JFileChooser.APPROVE_OPTION){
String pathFilename = fch.getSelectedFile().toString();
JFreeChart chart = GUIDataAnalyserFrame.createChart(pathFilename);
ChartPanel chartPanel = new ChartPanel(chart, true, true, true, false, true);
JButton button = new JButton("Calibrate");
JPanel buttonPanel = new JPanel();
buttonPanel.add(button);
chartPanel.revalidate();
GUIDataAnalyserApp.analyserFrame.add(chartPanel, BorderLayout.CENTER);
GUIDataAnalyserApp.analyserFrame.add(buttonPanel, BorderLayout.EAST);
GUIDataAnalyserApp.analyserFrame.revalidate();
}
}
}
为什么会这样,我需要改变什么?
猜测,因为您没有发布有效的 minimal code example program,但您应该从容器中删除旧组件,然后添加新组件,然后调用 revalidate()
THEN call repaint()
-- 您似乎遗漏了一个关键步骤。重绘应该有助于清除旧的 "dirty" 像素。
或者您可以走更简单的路线,只需使用 CardLayout 来帮助您交换视图。
我想在发生某些操作事件(单击按钮)后更改我的一些 JFrame 组件(JPanel、ChartPanel)。下面是一个具体的例子:
最初我的框架是空的(只有菜单栏,没有任何其他面板)。我正在单击菜单 'file > open',选择一个文件,这里变成了一个图表。之后为了清楚起见,我调整了框架的大小。一切都很完美。但接下来我再次单击选择文件以获取新图表,而不是我的图表未正确更新: here is an illustration of problem
这是我的代码:
public MenuBarDataAnalyser() {
JMenu menuFile = new JMenu("File");
itmOpen = new JMenuItem("Open...");
itmOpen.addActionListener(this);
add(menuFile);
menuFile.add(itmOpen);
}
@Override
public void actionPerformed(ActionEvent e) {
if(source == itmOpen){
final JFileChooser fch = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter("FITS file", "fits");
fch.setFileFilter(filter);
int response = fch.showOpenDialog(itmOpen);
if (response == JFileChooser.APPROVE_OPTION){
String pathFilename = fch.getSelectedFile().toString();
JFreeChart chart = GUIDataAnalyserFrame.createChart(pathFilename);
ChartPanel chartPanel = new ChartPanel(chart, true, true, true, false, true);
JButton button = new JButton("Calibrate");
JPanel buttonPanel = new JPanel();
buttonPanel.add(button);
chartPanel.revalidate();
GUIDataAnalyserApp.analyserFrame.add(chartPanel, BorderLayout.CENTER);
GUIDataAnalyserApp.analyserFrame.add(buttonPanel, BorderLayout.EAST);
GUIDataAnalyserApp.analyserFrame.revalidate();
}
}
}
为什么会这样,我需要改变什么?
猜测,因为您没有发布有效的 minimal code example program,但您应该从容器中删除旧组件,然后添加新组件,然后调用 revalidate()
THEN call repaint()
-- 您似乎遗漏了一个关键步骤。重绘应该有助于清除旧的 "dirty" 像素。
或者您可以走更简单的路线,只需使用 CardLayout 来帮助您交换视图。