Обновление JFreeChart / JPanel после изменения размера JFrame - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь использовать JFileChooser, чтобы выбрать файл Excel, который затем отображается JFreeChart.Я начинаю с выбора файла по умолчанию с classLoader в конструкторе, а затем использую JFileChooser для обновления моего графика.Проблема в том, что когда я выбираю файл, панель, на которой я отображаю график, не обновляется, пока я не изменю размер моего фрейма.


public class MyFrame extends JFrame 
{
    private static final long serialVersionUID = 1L;

    MyFrame() throws BiffException, IOException
    {
        this.setSize(1500,1000);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        graphPanel = new Graph();
        menu = new MenuBar(graphPanel);
        this.add(graphPanel);

        this.add(menu, BorderLayout.PAGE_START);
    }


    public static void main(String[] args) throws BiffException, IOException 
    {
        MyFrame idFrame = new MyFrame();
        idFrame.setVisible(true);
    }


    Graph graphPanel;
    MenuBar menu;

}



public class Graph extends JPanel
{

    Graph() throws BiffException, IOException
    {
        ClassLoader classLoader = getClass().getClassLoader();
        file = new File(classLoader.getResource("zeszyt.xls").getFile());


        FileInputStream f = new FileInputStream(file);
        Workbook w = Workbook.getWorkbook(f);
        Sheet s = w.getSheet("Sheet1");

        XYDataset dataset = createDataset(s);
        JFreeChart chart = ChartFactory.createXYLineChart("title","x", "y",dataset,PlotOrientation.VERTICAL,true, true, false);
        ChartPanel panel = new ChartPanel(chart);

        this.add(panel); 
        this.setLayout(new GridLayout(1,1));
    }

    private XYDataset createDataset(Sheet s) 
      {
        XYSeriesCollection dataset = new XYSeriesCollection();

        XYSeries series = new XYSeries("y = x^2");
        for(int i=1; i<39; i++)
        {
            series.add(Double.parseDouble(s.getCell(0,i).getContents()),Double.parseDouble(s.getCell(1,i).getContents()));
        }
        dataset.addSeries(series);

        return dataset;
      }

    public void setFile(File file) throws BiffException, IOException
    {
        this.file = file;
        FileInputStream f = new FileInputStream(file);
        Workbook w = Workbook.getWorkbook(f);
        Sheet s = w.getSheet("Sheet2");

        XYDataset dataset = createDataset(s);
        JFreeChart chart = ChartFactory.createXYLineChart("title here","x", "y",dataset,PlotOrientation.VERTICAL,true, true, false);
        ChartPanel panel = new ChartPanel(chart);

        this.removeAll();
        this.add(panel); 
        this.setLayout(new GridLayout(1,1));
        this.setBackground(Color.RED);
    }
    File file;
}

public class MenuBar extends JMenuBar 
{
    public MenuBar(Graph graphPanel) 
    {
        menu1 = new JMenu("Plik");

        JMenuItem menu1Item = new JMenuItem("Open file...");
        this.add(menu1);
        menu1.add(menu1Item);

        menu1Item.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                int returnValue = jfc.showOpenDialog(null);
                if (returnValue == JFileChooser.APPROVE_OPTION) 
                {
                    file = jfc.getSelectedFile();
                    try {
                        graphPanel.setFile(file);
                    } catch (BiffException | IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });


    }
    JMenu menu1;
    JMenuItem menu1Item;

    JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
    File file;

}


1 Ответ

1 голос
/ 20 апреля 2019

панель, на которой я отображаю график, не обновляется, если я не изменяю размер рамки.

Размер компонентов по умолчанию при создании равен (0, 0), поэтому ничего не происходитрисовать.Вам нужно вызвать диспетчер компоновки панели (после того, как все компоненты были добавлены), чтобы дать каждому компоненту размер / местоположение.

Итак, при добавлении компонентов в видимый GUI базовый код:

panel.add(...);
panel.revalidate(); // invoke the layout manager
panel.repaint(); // make sure panel is repainted.
...