在我的扩展JPanel
上绘图时,我希望大小可变。我已经计算出代码总是勾勒出1像素的边距。我的代码有效,但我不明白为什么在绘制矩形时我必须将尺寸的高度,宽度和高度调整为-1。
如果我绘制一个大小为1,1
的矩形,它会绘制一个像素的正方形,因此不应绘制宽度和高度而不使用-1修饰符。
如果有人可以解释为什么我的扩展JPanel
的大小之间存在差异,或者解释一个更好的方法来获得绘图区域的确切尺寸,我将不胜感激。
public class Engine extends JPanel {
Engine(){
}
@Override
public void paintComponent(Graphics g){
Dimension a = this.getSize();
g.setColor(Color.RED);
g.drawRect(0, 0, a.width-1, a.height-1);
}
}
答案 0 :(得分:2)
请记住,大多数值都是0。但不必说,“我希望我的面板宽度为199”,因此你得到一个200像素宽(0-199)的面板,Swing允许你指定1个基础值并在内部进行调整
如果你创建一个1,1,1,1的矩形,你实际创建一个位于1x1的矩形,其宽度和宽度为1。高度为1像素(1 + 1为2)
答案 1 :(得分:1)
“或者解释一个更好的方法来获得绘图区域的确切尺寸我会很感激。”
覆盖getPreferredSize()
班级中的JPanel
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
当您绘画时,请使用从getWidth()
类继承的getHeight()
和JPanel
。使用这些方法,您的绘画将通过调整面板的大小来动态调整大小。
int width = getWidth();
int height = getHeight();
g.fillRect((int)(width * 0.9), (int)(height * 0.9),
(int)(width * 0.8), (int)(height * 0.8));
旁注
您应该在super.paintComponent
方法中调用paintComponent
,以免破坏绘画链。
paintComponent
应为protected
而不是public
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}
答案 2 :(得分:0)
我已经计算出代码总是勾勒出1像素的边距。
不要做自定义绘画。使用Swing Border
。见How to Use Borders。您可能需要LineBorder
。