Java JPanel绘画不起作用

时间:2011-11-13 20:00:31

标签: java swing graphics jpanel paint

我在创建一个从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);
}

我甚至创建了一个方便的方法来调用内部类drawTitle方法(具有相同的名称)。我这样做是因为我希望这个JFrame外部类在按钮单击时可见,一旦它可见(这确保图形的初始化)我调用外部类drawTitle,后者又调用具有相同名称的内部类方法字符串显示被绘制...但这不起作用,我在面板上看不到它。这是我的按钮点击事件:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    GraphicsView view = new GraphicsView();
    view.setVisible(true);
    view.drawTitle("Hello");
}

在此先感谢,我将不胜感激任何帮助。 :)

2 个答案:

答案 0 :(得分:2)

  

我重写了paintComponent方法,无论我设置从这里绘制什么都可以正常工作

嗯,这个问题有答案。从paintComponent()方法中完成所有绘图。

  

但使用其他方法绘制不起作用。

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

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

答案 1 :(得分:0)

只需在paintComponent覆盖中调用drawTitle()函数,并将图形作为参数传递。像这样:

    @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);
    }

还尝试使标题成为该类的数据成员。这可能会在以后证明有用。