Eixo de domínio JFree rolável e rótulo de marcador personalizado

Eu tenho esse código para desenhar gráfico, isso funciona bem. Eu preciso de duas coisas aqui

no eixo do domínio (x) eu quero poder rolar.Nos marcadores, vejo uma linha grossa em negrito. Quero poder ver algum texto legível para este marcador.

Por enquanto eu vejo essa saída

e ao ampliar eu vejo isso

Também no eixo do domínio, tenho valores em milis. posso mapeá-lo para datas legíveis por humanos?

public class Grapher extends ApplicationFrame {

    public Grapher(final String title, List<PriceModel> priceModels) {

        super(title);
        final XYSeries series = new XYSeries("foo");
        double max = Double.MIN_VALUE, min = Double.MAX_VALUE;
        for (int i = 0; i < priceModels.size(); i++) {
            double price = priceModels.get(i).getPrice();
            if (price < min) {
                min = price;
            }
            if (price > max) {
                max = price;
            }
            series.add((double) priceModels.get(i).getDate(), price);
        }

        final XYSeriesCollection data = new XYSeriesCollection(series);
        final JFreeChart chart = ChartFactory.createXYLineChart(
                "XY Series Demo",
                "X",
                "Y",
                data,
                PlotOrientation.VERTICAL,
                true,
                true,
                false
        );

        for (int i = 0; i < priceModels.size(); i++) {
            if (priceModels.get(i).getAction() != null) {
                Marker marker = new ValueMarker((double) priceModels.get(i).getDate());
                marker.setLabelAnchor(RectangleAnchor.BOTTOM_RIGHT);
                marker.setLabelTextAnchor(TextAnchor.TOP_RIGHT);

                if (priceModels.get(i).getAction() == Types.Action.SELL) {
                    marker.setPaint(Color.green);
                    marker.setLabel("SELL");
                } else {
                    marker.setPaint(Color.red);
                    marker.setLabel("BUY");
                }
                marker.setStroke(new BasicStroke(10.0f));
                chart.getXYPlot().addDomainMarker(marker);
            }
        }
        chart.getXYPlot().setBackgroundPaint(Color.white);
        chart.getXYPlot().getRenderer().setPaint(Color.BLUE);
        chart.getXYPlot().getRangeAxis().setRange(min - 1, max + 1);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setBackground(Color.WHITE);
        chartPanel.setRangeZoomable(true);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }

    public static void draw(List<PriceModel> priceModels) {
        final Grapher demo = new Grapher("foo", priceModels);
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion