java - 如何自动调整 JFrame 上图表的大小?

标签 java swing resize jpanel jfreechart

我编写了一个代码,用于创建两个散点图和两个放置在 JFrame 上的 JPanel。 但是,当调整窗口大小时,我无法使它们自动适应窗口的大小。 以下是其中一个绘图类的代码:

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;
    }
}

这是图形初始化的代码:

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);
}

这是调整大小后的样子:

enter image description here

正如您所看到的,图表不适合窗口的大小。 有人可以帮我解决它吗? 任何帮助将不胜感激,谢谢。

最佳答案

默认布局JPanelFlowLayout ,它“让每个组件呈现其自然(首选)大小”,同时排除后续更改。 BorderLayout.CENTER 参数在此上下文中毫无意义。相反,请将两个面板添加到 GridLayout(1, 0)。这会将图表并排放置,并允许它们随着封闭容器大小的调整而增大和缩小。引用了完整的例子here .

image

关于java - 如何自动调整 JFrame 上图表的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36287510/

相关文章:

html - 无法使用 CSS 调整图像大小

java - 如何使用在EC2上运行的java aws SDK获取accesskey、secretkey

java - 使用 String.split 时,我不断收到 "ArrayIndexOutOfBounds"异常

java - 如何在 Reactor 中使用 Context 和 flatMap()?

java - Swing JTextField如何去掉边框?

python - 如何通过拖动使 PyQt 小部件可调整大小?

R如何使图例位置独立于图形大小

java - 远程保存上传的图片 - Java 和 Tomcat

java - Swing 改变 BasicArrowButton 的前景色

java - 在圆圈内绘制随机点