Проблема с setFont на графике (JFreeChart) - PullRequest
3 голосов
/ 08 января 2012

Я новичок в 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();
            }
        });
    }
}

Может ли кто-нибудь помочь мне решить эту проблему или дать какой-нибудь совет, как мне использовать нить в этом случае?

1 Ответ

3 голосов
/ 08 января 2012

Ваш код отлично работает на моей реализации.Вы можете попробовать этот вариант, чтобы увидеть, помогает ли использование существующего шрифта.Как предполагает @camickr, invokeLater() не требуется для EDT.

public void setButton(final JFreeChart chart, JButton button) {
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            TextTitle title = chart.getTitle();
            Font font = title.getFont();
            float size = font.getSize();
            title.setFont(font.deriveFont(size + 2));
        }
    });
}
...