在JPanel内部绘画

时间:2015-03-15 14:43:18

标签: java swing graphics jpanel paintcomponent

我试图在JPanel中表示给定的数学函数, 现在我只有轴,但轴不是绘画,我不知道为什么,顺便说一句,如果我在它绘制的框架内调用new Axis()

主要课程

public class MyClass{

final static int HEIGHT = 400;
final static int WIDTH = 400;

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setSize(WIDTH,HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setPanel(frame);

    frame.setVisible(true);
}

static void setPanel(JFrame frame) {
    JPanel panel = new JPanel();

    panel.setBackground(Color.GRAY);
    panel.add(new Axis());

    frame.add(panel);
}

}

Axis Class

@SuppressWarnings("serial")
public class Axis extends JComponent{
static final int LONG_AXIS = 150;

public void paintComponent(Graphics g) {

    int CenterX = getWidth()/2;
    int CenterY = getHeight()/2;

    g.setColor(Color.BLACK);

    //x axis line
    g.drawLine(CenterX - LONG_AXIS, CenterY, CenterX + LONG_AXIS, CenterY);

    //y axis line
    g.drawLine(CenterX, CenterY - LONG_AXIS, CenterX, CenterY + LONG_AXIS);

}


}

另一个问题:是否可以使用多种绘画方法?

1 个答案:

答案 0 :(得分:2)

运行时,请检查Axis对象的大小,并且您可能会发现它的大小为[0,0]或[1,1],因为您要将其添加到JPanel中默认情况下使用FlowLayout,因此不会导致Axis扩展,并且Axis的默认首选大小为[0,0]。

考虑重写Axis组件的getPreferredSize()方法以返回合理的维度,或者让其包含JPanel使用BorderLayout并将其添加到BorderLayout.CENTER,或者同时执行这两个操作。

另外,不要忘记在覆盖中调用super的paintComponent方法。


关于,

  

好的,我的意思是它是一个很好的练习,例如轴的一个绘制方法,另一个绘制数学函数的绘制方法

考虑创建paintComponent(...)为每个步骤调用的方法。如果复杂,您可以将它委托给绘图组件保存的非组件对象,并再次将其委托给paintComponent调用。

此外,图像的静态部分(即x轴和y轴)最好绘制到BufferedImage,然后通过g.drawImage(....)

在paintComponent中绘制