2016-07-20 23 views
0

Ich versuche, einen JFreeChart Untertitel zu einem zentrierten Titel so ausgerichtet, dass der Haupttitel in der ChartFrame zentriert ist, aber der Untertitel ausgerichtet ist am linken Rand des Titels. Die einzige Möglichkeit, dies zu tun, war, den Titel und den Untertitel auf HorizontalAlignment.LEFT zu setzen. Dann würde ich das Programm so einstellen, dass das linke Padding des Titels so eingestellt wird, dass es zentriert ist, und dann den Untertitel-Padding so einstellen, dass er dem des Titels entspricht, wodurch er auf den gleichen linken Rand ausgerichtet wird Titel bis zur Mitte des Rahmens wie folgt aus:JFreeChart chart.getWidth() funktioniert nicht beim Versuch, Untertitel auf zentrierten Titel zu richten

// Make the chart 
JFreeChart chart = ChartFactory.createTimeSeriesChart(title, "Time (Hour)", "Vehicles Parked", dataset, true, true, false); 

ChartFrame frame = new ChartFrame("Chart", chart); 
frame.pack(); 
frame.setVisible(true); 

chart.getTitle().setHorizontalAlignment(HorizontalAlignment.LEFT); 
chart.getTitle().setPadding(0, (frame.getWidth()/2)-(chart.getTitle().getWidth()/2), 0, 0); 

TextTitle subtitle1 = new TextTitle(
     "This is a test subtitle in which I would like\nthe subtitle to be lined up to the title", // text 
     chart.getTitle().getFont().deriveFont(chart.getTitle().getFont().getSize() * 0.6f), // font (shrunk title) 
     chart.getTitle().getPaint(), // paint 
     RectangleEdge.TOP, // position 
     HorizontalAlignment.LEFT, //chart2.getTitle().DEFAULT_HORIZONTAL_ALIGNMENT, // horizontal alignment 
     VerticalAlignment.BOTTOM, // vertical alignment 
     chart.getTitle().getPadding() // padding 
); 
chart.addSubtitle(subtitle1); 

Bei dem Versuch, dies zu tun, die chart.getTitle().getWidth() Methode zurückkehrt 0.0 jedes Mal, und ich kann nicht herausfinden, warum. Ich habe versucht, chart.getTitle() zu einem AbstractBlock zu werfen, aber das macht keinen Unterschied. Ich glaube, es hat etwas mit der Tatsache zu tun, dass in der JavaDoc for the getWidth() method in the AbstractBlock class, erwähnt es wird die Breite zurückgeben, wenn es im Voraus weiß, was es anscheinend nicht tut.

Ich möchte wissen, wie man den Diagrammtitel erhält, um seine Breite korrekt zurückzugeben, ob mit der getWidth() Funktion oder nicht. Ich würde auch gerne wissen, ob es eine bessere Möglichkeit gibt, Elemente eines Diagramms im Gegensatz zu den Seiten des ChartFrame aneinander auszurichten, anstatt ihre Auffüllung anzupassen.

Kreuz geschrieben here.

+0

Cross-gepostet [hier] (http://www.jfree.org/forum/viewtopic.php?f=3&t=117630). – trashgod

Antwort

1

Wie beantwortet here.

Was ich zu tun hatte Untertitel an den linken Rand des Titels auszurichten, sondern halte das in der Mitte des Rahmens ausgerichtet ganze Sache war es, beiden Elemente zu einem BlockContainer mit einem ColumnArrangement, zu setzen und dann ein CompositeTitle erstellen aus die BlockContainer, und richten Sie das entsprechend aus.

JFreeChart chart = ChartFactory.createXYLineChart(
     "Has to have a wider title than subtitle", // chart title 
     "X", // x axis label 
     "Y", // y axis label 
     dataset, // data 
     PlotOrientation.VERTICAL, 
     true, // include legend 
     true, // tooltips 
     false // urls 
); 

String subtitleText = "This is a test subtitle\nIt is also a test of whether or not newlines work"; 

TextTitle subtitle = new TextTitle(
     subtitleText, // text 
     chart.getTitle().getFont().deriveFont(chart.getTitle().getFont().getSize() * 0.6f), // font (shrunk title) 
     chart.getTitle().getPaint(), // paint 
     RectangleEdge.TOP, // position 
     HorizontalAlignment.LEFT, //chart2.getTitle().DEFAULT_HORIZONTAL_ALIGNMENT, // horizontal alignment 
     VerticalAlignment.BOTTOM, // vertical alignment 
     chart.getTitle().getPadding() // padding 
); 

BlockContainer blockContainer = new BlockContainer(new ColumnArrangement(HorizontalAlignment.LEFT, VerticalAlignment.TOP, 0, 0)); 
blockContainer.add(chart.getTitle()); 
blockContainer.add(subtitle); 
CompositeTitle compositeTitle = new CompositeTitle(blockContainer); 
compositeTitle.setPosition(RectangleEdge.TOP); 
compositeTitle.setVerticalAlignment(VerticalAlignment.CENTER); 
chart.getTitle().setVisible(false); 
chart.addSubtitle(compositeTitle); 

ChartFrame frame = new ChartFrame("Frame", chart); 
frame.pack(); 
frame.setVisible(true);