2016-03-29 6 views
0

Ich habe einen Code geschrieben, der zwei Scatter und zwei JPanels auf einem JFrame erstellt. Allerdings konnte ich sie nicht automatisch an die Größe des Fensters anpassen, wenn es in der Größe geändert wird. Hier ist der Code für eine der Zeichnungsklassen:Wie kann ich die Diagramme auf einem JFrame automatisch skalieren?

class ALTCanvas extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    private XYSeries alts = new XYSeries("Altitude"); 

    public ALTCanvas() { 
     final ChartPanel chartPanel = createDemoPanel(); 
     this.add(chartPanel, BorderLayout.CENTER); 
    } 

    private void update(double xnew, double ynew) { 
     alts.add(new XYDataItem(xnew, ynew)); 
    } 

    private ChartPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      "", "Time [epoch]", "Altitude [m]", createSampleData(), 
      PlotOrientation.VERTICAL, false, true, false); 
     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     NumberAxis range = (NumberAxis) xyPlot.getRangeAxis(); 
     range.setTickUnit(new NumberTickUnit(0.5)); 
     return new ChartPanel(jfreechart){ 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(640, 480); 
      } 
     }; 
    } 

    private XYDataset createSampleData() { 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     xySeriesCollection.addSeries(alts); 
     return xySeriesCollection; 
    } 

    private String stdCalc(){ 
     double sum = 0, avg = 0; 
     double var = 0; 
     for(int i = 0; i < alts.getItemCount(); i++){ 
      sum += (double) alts.getY(i); 
     } 
     avg = sum/alts.getItemCount(); 
     for(int i = 0; i < alts.getItemCount(); i++){ 
      var += ((double)alts.getY(i) - avg)*((double)alts.getY(i) - avg); 
     } 
     String str = ""; 
     str += Math.sqrt(var); 
     return str; 
    } 
} 

Hier ist der Code für die Initialisierung der Grafik:

public void initGrafics() { 
    // create and set up the window 
    JFrame frame = new JFrame("Position/Altitude"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // set up the content pane 
    Container C = frame.getContentPane(); 

    // create canvas objects 
    PC = new POSCanvas(); 
    PC.setBorder(BorderFactory.createRaisedBevelBorder()); 
    AC = new ALTCanvas(); 
    AC.setBorder(BorderFactory.createRaisedBevelBorder()); 

    JPanel left = new JPanel(); 
    left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS)); 
    JLabel prcP = new JLabel("Precision [m]: "); JLabel acrP = new JLabel("Accuracy [m]: "); 
    prcTp = new JTextField("   "); acrTp = new JTextField("   "); 
    JPanel labelsP = new JPanel(); 
    labelsP.setLayout(new FlowLayout()); 
    labelsP.add(prcP); labelsP.add(prcTp); labelsP.add(acrP); labelsP.add(acrTp); 
    left.add(PC); left.add(labelsP); 

    JPanel right = new JPanel(); 
    right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS)); 
    JLabel stdA = new JLabel("Standard deviation [m]: "); stdTa = new JTextField("   "); 
    JPanel labelsA = new JPanel(); 
    labelsA.setLayout(new FlowLayout()); 
    labelsA.add(stdA); labelsA.add(stdTa); 
    right.add(AC); right.add(labelsA); 

    // add objects to the pane 
    C.setLayout(new BoxLayout(C, BoxLayout.X_AXIS)); 
    C.add(left); C.add(right); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    frame.setLocation(500, 500); 
} 

Hier ist, wie es aussieht, nachdem die Größenänderung:

enter image description here

Wie man sieht, passt das Diagramm nicht zur Größe des Fensters. Kann mir jemand helfen, wie ich es beheben kann? Jede Hilfe wäre willkommen, danke.

Antwort

1

Das Standardlayout von JPanel ist FlowLayout, das "jede Komponente ihre natürliche (bevorzugte) Größe annehmen lässt" und dabei nachfolgende Änderungen ausschließt. Der Parameter BorderLayout.CENTER ist in diesem Zusammenhang bedeutungslos. Fügen Sie stattdessen die zwei Felder zu GridLayout(1, 0) hinzu. Dadurch werden die Diagramme nebeneinander platziert und können vergrößert und verkleinert werden, wenn die Größe des umschließenden Containers geändert wird. Ein vollständiges Beispiel wird zitiert here.

image

+0

Ich habe alles versucht. versucht, die Layouts aller Panels zu ändern, aber es funktioniert immer noch nicht. Das einzige, was ich mir vorstellen kann, ist, die Größe des Diagramms größer zu machen, aber dann wird es immer noch nicht neu skaliert. –

+0

Das ist seltsam; Das [Beispiel] (http://stackoverflow.com/a/7602126/230513) funktioniert für mich auf mehreren Plattformen. Bearbeiten Sie Ihre Frage so, dass sie eine [mcve] enthält, die Ihre aktuelle Vorgehensweise anzeigt. – trashgod

Verwandte Themen