Java JPanel绘画不起作用
我在创建一个从JPanel扩展的内部类以在其上绘制任何内容时遇到了一个问题。我重写了paintComponent方法,我在这里设置的任何绘制方法都可以很好地工作,但是使用另一种方法绘制都不起作用 这是我的内部类代码: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
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已经指出的那样:做吧。不使用。这种方法很流行