我是新手,我一直在关注Oracle网站上的教程。所以我有一个imagePanel类使用它,我将图像绘制到JPanel
上。接下来,我需要在此图像上绘制 形状。所以我在imagePanel类的drawShapes
方法中调用paintComponent
函数。我面临的问题是,每当我绘制任何形状时都说rect
或oval
它不会根据我为y轴指定的位置绘制形状。它只考虑x轴。理想情况下,
fillOval(30,70,10,10)
等于fillOval(30,30,10,10)
我做错了什么还是有办法克服这个问题?
public class ImagePanel extends JPanel {
private Image img;
public ImagePanel(String loc)
{
this(new ImageIcon(loc).getImage());
}
public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
renderShapes(g);
}
private void renderShapes(g){
Graphics2D g2d = (Graphics2D)g;
g2d.fillOval(20,70,10,10);
g2d.fillRect(120,40,10,10);
}
}
编辑所提供屏幕截图的renderShapes
方法发布在下方。
private void renderShapes(g){
Graphics2D g2d = (Graphics2D)g;
g2d.fillRect(220,50,10,10);
g2d.fillRect(20,140,10,10);
}
答案 0 :(得分:5)
您必须了解x,y坐标如何在Swing自定义绘图中工作以定位组件。
尝试了解下面的屏幕截图。
在此处查找示例代码以了解相同的概念
尝试使用此示例代码,使用网格分隔10像素来理解x和y坐标,并查看形状是否位于正确的位置?
示例代码:
class DrawPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
for (int i = 0; i < getHeight(); i = i + 10) {
g.drawLine(0, i, getWidth(), i);
}
for (int i = 0; i < getWidth(); i = i + 10) {
g.drawLine(i, 0, i, getHeight());
}
g.setColor(Color.RED);
g.fillOval(20, 70, 10, 10);
g.setColor(Color.GREEN);
g.fillRect(120, 40, 10, 10);
}
}
DrawPanel drawPanel = new DrawPanel();
drawPanel.setBackground(Color.WHITE);
快照:
使用JComponent#getPreferredSize()代替setPreferredSize()
。
了解更多Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?