当前位置: 首页 > 知识库问答 >
问题:

JPanel内部绘画

齐昆
2023-03-14

我试图在JPanel中表示一个给定的数学函数,因为现在我只有轴,但是轴没有绘制,我不知道为什么,顺便说一下,如果我在框架中调用< code>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);
}

}

轴类

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

关胜
2023-03-14

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

考虑重写Axis组件的getPreferredSize()方法以返回一个合理的维度,或者让其包含的JPanel使用BorderLayout并添加BorderLayout。居中,或两者都做。

此外,不要忘记在重写中调用超级的paintComponent方法

关于

好的,我的意思是如果这是一个好的实践,例如一个绘制轴的方法,和另一个绘制数学函数的方法

考虑创建 paintComponent(...) 为上述每个步骤调用的方法。如果复杂,可以将其委托给绘图组件包含的非组件对象,然后再次调用 paintComponent 。

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

 类似资料:
  • 我最近需要在一个JScrollPane的viewport视图中放置几个组件,其中包括一个JTextPane。 我将所有组件(两个JPanel和JTextPane)放在另一个JPanel中,这个JPanel有一个BorderLayout LayoutManager,并将该JPanel设置为ScrollPane的viewport视图。 我立即注意到: JTextPane不再根据JScrollPane的

  • 问题内容: 我如何告诉paint方法仅在JPanel上而不是在整个JFrame上绘制背景。我的JFrame大小大于JPanel。当我尝试为JPanel绘制网格背景时,网格似乎遍及整个JFrame,而不仅仅是JPanel。 以下是部分代码: 问题答案: camickr是正确的。所以: 您需要严格将工程图与不同组件分开。Swing已经在管理子组件,因此绝对不需要在Panel的Frame中实现图形(调用

  • 问题内容: 我正在用Java编写的Paint应用程序上工作,并 遇到了一些(更多)问题。我有一个gui和一个工作程序(kinda),我唯一的问题是 用户绘制的线条和图形没有保存(在 绘制下一个图形后消失)。 从过去的问题中,我了解到我将需要使用BufferedImage来 存储图形,然后在我的绘画类中绘画它。 我的问题是,任何人都可以提供有关如何使用 缓冲图像来存储和绘制图形的基本解释/示例,以及

  • 问题内容: 我如何获得JPanel所在的JFrame? 我当前的解决方案是询问面板的父面板(依此类推),直到找到Window: 标准库中有没有一种更优雅的方法? 问题答案: 您可以使用 将返回可转换为顶级类型的Window的方法。

  • 我有JPanel,它包含: JButton和JLabel,其中设置了图片 我想把按钮放在JLabel顶部的北中心位置。目前它的设置彼此相邻,我不知道如何覆盖JLabel。 我在这里尝试了许多解决方案,但是它似乎并不完全按照我想要的方式工作。谢谢! 更新:按钮放在JLabel的顶部,但不在里面。

  • 我在JScrollPane中有一个JPanel,JScrollPane嵌套在其他容器中。我的JPanel在这个问题中使用了SO user jxd中修改过的FlowLayout。 这可能是信息过火,但所讨论的面板的完整嵌套如下所示: JPanel(ModifiedFlowLayout)>JScrollPane>JPanel(GridBagLayout)>JTabbedPane>JPanel(Grid