繁体   English   中英

获取图形以在屏幕上自动调整

[英]Getting a graph to auto adjust with the screen

我已经在Java小程序中创建了一个图形,并且试图使g.fillRect能够随着屏幕自动调整。 我希望第一个小节成为屏幕的三分之一,然后将其他小节的大小减半。

g.fillRect(xpos, 550, width, hight);

我似乎在每个小节之间都留有空隙。 您能帮我解决这个问题吗? 提前致谢。

您必须计算每个单独的条的宽度,即

barWidth = availableWidth / numberOfBars - 1

“ -1”将是条形之间的剩余空间,因此在计算实际坐标时必须再次添加。 您可以花一些时间在其中进行细节处理:当数字不是“很好地可分割”时,条形图必须具有不同的宽度,或者您必须在左侧和右侧添加一个小的边距以补偿奇数大小。

但是,这是一个可能的解决方案的简要概述:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class BarChart
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.getContentPane().setLayout(new BorderLayout());

        final JSlider slider = new JSlider(1, 50, 3);
        final BarChartPanel barChartPanel = new BarChartPanel();
        slider.addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e)
            {
                barChartPanel.setNumberOfBars(slider.getValue());
            }
        });

        f.getContentPane().add(slider, BorderLayout.NORTH);
        f.getContentPane().add(barChartPanel, BorderLayout.CENTER);

        f.pack();
        f.setSize(600,600);
        f.setVisible(true);
    }
}


class BarChartPanel extends JPanel
{
    private int numberOfBars = 3;

    void setNumberOfBars(int n)
    {
        this.numberOfBars = n;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        Random random = new Random(0);
        int barWidth = getWidth() / numberOfBars - 1;
        int barsWidth = numberOfBars * (barWidth+1);
        int offsetX = (getWidth() - barsWidth) / 2;
        for (int b=0; b<numberOfBars; b++)
        {
            int x = offsetX + b * (barWidth + 1);
            int barHeight = random.nextInt(500);
            int y = getHeight() - barHeight;
            g.fillRect(x, y, barWidth, barHeight);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM