Java JPanel绘画不起作用

Java JPanel绘画不起作用,java,swing,graphics,jpanel,paint,Java,Swing,Graphics,Jpanel,Paint,我在创建一个从JPanel扩展的内部类以在其上绘制任何内容时遇到了一个问题。我重写了paintComponent方法,我在这里设置的任何绘制方法都可以很好地工作,但是使用另一种方法绘制都不起作用 这是我的内部类代码: private class Plot extends JPanel { public Plot() { this.setBackground(Color.WHITE); } @Override public void paintC

我在创建一个从JPanel扩展的内部类以在其上绘制任何内容时遇到了一个问题。我重写了paintComponent方法,我在这里设置的任何绘制方法都可以很好地工作,但是使用另一种方法绘制都不起作用

这是我的内部类代码:

private class Plot extends JPanel {

    public Plot() {
        this.setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics graphic) {
        super.paintComponent(graphic);
        Graphics2D graphic2d = (Graphics2D) graphic;

        graphic2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        graphic2d.drawOval(0, 0, this.getWidth() - 1, this.getHeight() - 1);
    }

    public void drawTitle(final String title) {
        Graphics2D graphic2d = (Graphics2D) this.getGraphics();
        graphic2d.setColor(Color.red);
        graphic2d.drawString(title, 1, 10);
    }
}
请注意drawTitle方法。我只想显示一个自定义文本。在从JFrame扩展而来的外部类中,我创建了这样一个内部类的实例:

private Plot plot;

/** Creates new form GraphicsView */
public GraphicsView() {
    initComponents();
    plot = new Plot();
    this.add(plot, BorderLayout.CENTER);
}

public void drawTitle(final String title) {
    this.plot.drawTitle(title);
}
    @Override
    public void paintComponent(Graphics graphic) {

        super.paintComponent(graphic);
        Graphics2D graphic2d = (Graphics2D) graphic;

        graphic2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        graphic2d.drawOval(0, 0, this.getWidth() - 1, this.getHeight() - 1);
        drawTitle(graphic, title);
    }

    public void drawTitle(Graphics g, final String title) {
        Graphics2D graphic2d = (Graphics2D) g;
        graphic2d.setColor(Color.red);
        graphic2d.drawString(title, 1, 10);
    }
我甚至创建了一个方便的方法来调用内部类drawTitle方法(使用相同的名称)。我这样做是因为我希望这个JFrame外部类在单击按钮时可见,一旦它可见(这确保了图形的初始化),我调用外部类drawTitle,它反过来调用具有相同名称的内部类方法,并在其中绘制字符串show。。。但这不起作用,我在面板上看不到。以下是我的按钮点击事件:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    GraphicsView view = new GraphicsView();
    view.setVisible(true);
    view.drawTitle("Hello");
}
提前感谢,我将感谢您的帮助。:)

我重写了paintComponent方法,从这里开始绘制的任何内容都可以正常工作

好吧,这是问题的答案。使用paintComponent()方法绘制所有图形

但是用另一种方法画画是行不通的

不要使用getGraphics()方法。您应该只使用传递给paintComponent()方法的图形对象

您无法控制Swing重新绘制()组件的时间。因此,每次重新绘制组件时,都会调用paintComponent()方法,其他自定义绘制代码将丢失。

只需调用paintComponent覆盖中的drawTitle()函数,并将图形作为参数传递即可。大概是这样的:

private Plot plot;

/** Creates new form GraphicsView */
public GraphicsView() {
    initComponents();
    plot = new Plot();
    this.add(plot, BorderLayout.CENTER);
}

public void drawTitle(final String title) {
    this.plot.drawTitle(title);
}
    @Override
    public void paintComponent(Graphics graphic) {

        super.paintComponent(graphic);
        Graphics2D graphic2d = (Graphics2D) graphic;

        graphic2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        graphic2d.drawOval(0, 0, this.getWidth() - 1, this.getHeight() - 1);
        drawTitle(graphic, title);
    }

    public void drawTitle(Graphics g, final String title) {
        Graphics2D graphic2d = (Graphics2D) g;
        graphic2d.setColor(Color.red);
        graphic2d.drawString(title, 1, 10);
    }

同时尝试使标题成为类的数据成员。这以后可能会有帮助。

谢谢你的回答。我明白你告诉我的。现在,您建议我如何在paintComponent方法中绘制自定义和动态文本?标题应该是您始终绘制的Plot类的属性。然后有一个方法setTitle(),用于存储标题的新值。然后调用repaint(),组件将重新绘制自身。因此,您需要的不是drawTitle()方法,而是setTitle()方法。请再次使用getGraphics。。。似乎在流行。。。正如@camickr已经指出的那样:做吧。不使用。这种方法很流行