我已经在 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);
}
}
}
关于java - 获取图表以随屏幕自动调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237432/