我在创建一个从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");
}
在此先感谢,我将不胜感激任何帮助。 :)
答案 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);
}
还尝试使标题成为该类的数据成员。这可能会在以后证明有用。