JPanel精确绘图尺寸/限制?

时间:2014-03-23 07:39:04

标签: java swing graphics jpanel paintcomponent

在我的扩展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);
  }
}

3 个答案:

答案 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