2014-03-19 101 views
0

我知道此問題早前已被詢問(here,herehere),但所提供的解決方案不起作用。因此,請不要將其標記爲重複。我正在使用JFreeChart繪製折線圖。然後我把這個圖表放入一個JPanel中,然後放入tabbedPane。 我知道直接把JPanel放在JFrame中可以調整大小,但是我怎麼能這樣做呢?JPanel中可調整大小的JFreeChart

public class DynamicLineAndTimeSeriesChart extends JPanel implements ActionListener { 
    private ArrayList<TimeSeries> Series = new ArrayList<TimeSeries>(); 
    private ArrayList<Double> Last = new ArrayList<Double>(); 
    private String Id1; 
    private Timer timer = new Timer(250, this); 
    public DynamicLineAndTimeSeriesChart(String id) { 

     Runtime runtime = Runtime.getRuntime(); 
     int NoOfProc = runtime.availableProcessors(); 
     for (int i = 0; i < NoOfProc; i++) { 
      Last.add(new Double(100.0)); 
      Series.add(new TimeSeries("Core" + i, Millisecond.class)); 
     } 
     Id1 = id; 
     final TimeSeriesCollection dataset = new TimeSeriesCollection(); 
     for (int i = 0; i < NoOfProc; i++) { 
      dataset.addSeries(this.Series.get(i)); 
     } 
     final JFreeChart chart = createChart(dataset); 
     timer.setInitialDelay(1000); 
     chart.setBackgroundPaint(Color.LIGHT_GRAY); 

     //Created JPanel to show graph on screen 
     final JPanel content = new JPanel(new GridLayout()); 
     final ChartPanel chartPanel = new ChartPanel(chart); 
     content.add(chartPanel, BorderLayout.CENTER); 
     content.revalidate(); 
     this.add(content); 

     timer.start(); 
    } 

createChart是一種JFreeChart類型的方法。 這個類被稱爲另一類

JPanel main = new JPanel(new BorderLayout()); 
main.add(demo); 
jTabbedPane1.add("Core", main); 
demo.setVisible(true); 

使用NetBeans完成框架設計。 我已經嘗試了所有的解決方案,如將BorderLayout的佈局更改爲GridBagLayout,甚至提到了here

+0

也許content.pack()? – djb

+0

*「我知道這個問題早已被問到,但提供的解決方案並不奏效。」*在哪裏?請鏈接.. –

+0

究竟是什麼問題?調整內容大小時,是否希望chartPanel自動調整大小? –

回答

1

BorderLayout.CENTER應該讓ChartPanel隨着幀的大小調整而增長。我猜你有一個JPanelFlowLayout,它繼續使用圖表面板的首選大小。由於FlowLayout是默認值,因此您可能需要查找它。

編輯:有一個完整的示例here,它將折線圖添加到選項卡式窗格中。您的DynamicLineAndTimeSeriesChart有默認FlowLayout;我想你想要一個GridLayout

public DynamicLineAndTimeSeriesChart(String id) { 
    this.setLayout(new GridLayout()); 
    … 
} 
+0

你能指定嗎?我已經使用了兩個JPanel,並且他們的佈局已經更改爲borderlayout。 – sol

+0

我不知道爲什麼這是行不通的;你能編輯你的問題來展示一個完整的例子嗎? –

+0

已經完成了編輯,但發佈完整的代碼是不可能的,所以我發佈了相關部分。感謝您的幫助。 – sol

0

沒有看到你所有的代碼,它只能被推測。但是,作爲一種解決方法,你可以讓你的JPanel偵聽調整大小事件具有的ComponentListener,是這樣的:

content.addComponentListener(new ComponentAdapter(){ 
     public void componentResized(ActionEvent e){ 
      chartPanel.setSize(content.getSize()); 
     } 
    }); 
+0

仍然沒有改變,圖形沒有調整大小。 – sol

+0

你有沒有嘗試過監控veriables? chartPanel.setSize(content.getSize())之後的chartpanel的大小和它的容器是什麼?我不能想到爲什麼這不應該起作用的原因。 –

0

我有同樣的問題,我設法解決這個問題是這樣的: (1)創建該擴展JPanel的自定義類 (2)得到的大小在某種程度上,你想傳遞給你的圖表 (3)創建它返回一個像這樣的「ChartPanel」對象的方法:

ChartPanel chart() { 
    //... custom code here 
    JFreeChart chart = ChartFactory.createPieChart(title, pieDataset, false, false, false);`enter code here` 
    // Now: this is the trick to manage setting the size of a chart into a panel!: 
    return new ChartPanel(chart) { 
     public Dimension getPreferredSize() { 
      return new Dimension(width, height); 
     } 
    }; 
} 

我準備了SSCCE讓你知道它是如何工作的:

import java.awt.Dimension; 
import java.util.ArrayList; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset; 

public class MyPieChart extends JPanel { 

    public static void main(String[] args) { 
     example1(); 
     example2(); 
     example3(); 
    } 

    public static void example1() { 
     JPanel panel = new JPanel(); 
     panel.setBounds(50, 80, 100, 100); 
     MyPieChart piePanel = new MyPieChart("Example 1", dataset(), panel); 
     panel.add(piePanel); 
     JFrame frame = new JFrame(); 
     frame.setLayout(null); 
     frame.setBounds(10, 10, 200, 300); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public static void example2() { 
     MyPieChart piePanel = new MyPieChart("Example 2", dataset(), 30, 50, 100, 100); 
     JFrame frame = new JFrame(); 
     frame.setLayout(null); 
     frame.setBounds(210, 10, 200, 300); 
     frame.add(piePanel); 
     frame.setVisible(true); 
    } 

    public static void example3() { 
     MyPieChart piePanel = new MyPieChart("Example 3", dataset(), 100, 100); 
     piePanel.setLocation(0,0); 
     JFrame frame = new JFrame(); 
     frame.setLayout(null); 
     frame.setBounds(410, 10, 200, 300); 
     frame.add(piePanel); 
     frame.setVisible(true); 
    } 

    static ArrayList<ArrayList<String>> dataset() { 
     ArrayList<ArrayList<String>> dataset = new ArrayList<ArrayList<String>>(); 
     dataset.add(row("Tom", "LoggedIn", "Spain")); 
     dataset.add(row("Jerry", "LoggedOut", "England")); 
     dataset.add(row("Gooffy", "LoggedOut", "France")); 
     return dataset; 
    } 

    static ArrayList<String> row(String name, String actualState, String country) { 
     ArrayList<String> row = new ArrayList<String>(); 
     row.add(name); row.add(actualState); row.add(country); 
     return row; 
    } 

    ArrayList<ArrayList<String>> dataset; 
    DefaultPieDataset pieDataset = new DefaultPieDataset(); 
    int width, height, posX, posY; 
    int colState = 1; 
    String title; 
    String LoggedIn = "LoggedIn"; 
    String LoggedOut = "LoggedOut"; 

    public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, int...args) { 

     if(args.length==2) { 
      this.width = args[0]; 
      this.height = args[1]; 
      this.setSize(width, height); 
     } 
     else if(args.length==4) { 
      this.posX = args[0]; 
      this.posY = args[1]; 
      this.width = args[2]; 
      this.height = args[3]; 
      this.setBounds(posX, posY, width, height); 
     } 
     else { 
      System.err.println("Error: wrong number of size/position arguments"); 
      return; 
     } 

     this.title = title; 
     this.dataset = dataset; 
     this.add(chart()); 
    } 

    public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, JPanel panel) { 
     this.title = title; 
     this.dataset = dataset; 
     this.width = panel.getWidth(); 
     this.height = panel.getHeight(); 
     this.setBounds(panel.getBounds()); 
     this.add(chart()); 
    } 

    ChartPanel chart() { 

     int totalLoggedIn = 0; 
     int totalLoggedOut = 0; 

     for(ArrayList<String> user : dataset) { 
      if(user.get(colState).equals(LoggedIn)) totalLoggedIn++; 
      else totalLoggedOut++; 
     } 
     pieDataset.clear(); 
     pieDataset.setValue(LoggedIn +": "+ totalLoggedIn, totalLoggedIn); 
     pieDataset.setValue(LoggedOut +": "+ totalLoggedOut, totalLoggedOut); 

     JFreeChart chart = ChartFactory.createPieChart(title, pieDataset, false, false, false); 

     return new ChartPanel(chart) { // this is the trick to manage setting the size of a chart into a panel! 
      public Dimension getPreferredSize() { 
       return new Dimension(width, height); 
      } 
     }; 
    } 
} 

我真的希望它有幫助!