我试图在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);
}
}
另一个问题:是否可以使用多种绘画方法?
答案 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(....)