Я новичок в Java. Я пытаюсь создать простой графический интерфейс со свингом с кнопкой, который меняет шрифт графика из библиотеки JFreeChart. Однако, когда я использую chart.setFont, графический интерфейс останавливается на пару секунд. Я прочитал, что я должен использовать setFont в другом потоке, чтобы избежать проблемы, но это не похоже на работу для меня - возможно, я делаю это неправильно. Я поставил свой код ниже:
package javaapplication2;
import java.awt.Font;
import java.awt.event.*;
import javax.swing.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public final class Main{
Main(){
JFrame frame=new JFrame();
DefaultCategoryDataset data=new DefaultCategoryDataset();
JFreeChart chart=ChartFactory.createBarChart("Title", "Name", "Grade", data, PlotOrientation.VERTICAL,
true, false, false);
ChartPanel chartPanel=new ChartPanel(chart);
JPanel subPanel=new JPanel();
JPanel panel=new JPanel();
JButton button=new JButton("Click");
setButton(chart, button);
setChart(data);
setSubPanel(subPanel, chartPanel);
setPanel(panel, button, subPanel);
setFrame(frame);
frame.setContentPane(panel);
frame.validate();
frame.setVisible(true);
}
public void setFrame(JFrame frame){
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
}
public void setPanel(JPanel panel, JButton button, JPanel subPanel){
panel.add(button);
panel.add(subPanel);
}
public void setSubPanel(JPanel subPanel, ChartPanel chartPanel){
subPanel.add(chartPanel);
}
public void setButton(final JFreeChart chart, JButton button){
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
chart.getTitle().setFont(new Font("Sans-Serif", Font.PLAIN, 18));
}
}
);
}
});
}
public void setChart(DefaultCategoryDataset data){
data.addValue(1, "abc", "");
data.addValue(2, "def", "");
data.addValue(3, "ghi", "");
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
Main frame=new Main();
}
});
}
}
Может ли кто-нибудь помочь мне решить эту проблему или дать какой-нибудь совет, как мне использовать нить в этом случае?