2015-10-30 57 views
-1

我对Java的Graphics部分非常陌生。我创建了一个框架,并在其上添加了一个颜色设置为绿色的面板。现在单击该面板,我想使用名为Mypanel的测试类对象绘制一个圆。但它没有发生。请指导!如何在Java Swing中使用重绘方法

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

class Mypanel extends JPanel 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     g.drawOval(15, 15, 5, 5); 
    }   
} 
public class algo extends javax.swing.JFrame { 

    public algo() { 
     initComponents(); 
     jPanel1.setBackground(Color.GREEN); 
    } 
    Mypanel p = new Mypanel() ; 

    private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {          
     p.repaint(); 
    }          

    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new algo().setVisible(true); 
      } 
     }); 
    } 

} 

如果我猜我会说我不应该使用重绘方法,但我被告知这是要使用。

+0

在我看来,当你改变结构时,你将需要重绘,即椭圆形为方形或相似。在大部分时间里,组件变化会自动反映出来。当你打电话给特定属性的setter方法时。 – Acewin

+1

这是不可能的,因为你的问题中没有包含你的'initComponents()'方法,但可能的原因是你的'Mypanel'实例的宽度为零,高度为零。您可以通过在Mypanel类中覆盖[getPreferredSize()](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#getPreferredSize--)来解决此问题。另外,重写的paintComponent方法的第一行应该总是'super.paintComponent(g);'。如果你不这样做,你会看到奇怪的行为。 – VGR

+0

根据你的代码,我相信你是C#程序员,对吧? 在Java中,只有创建一个包含对象名称和修饰符“MouseClicked”的Method才不会将事件添加到对象中。我吸收你学习更多有关Java,事件,命名召唤之前,然后重写你的代码=) –

回答

-2

有几件事情在你的例子来纠正......

当你创建(即构造函数),你要调用super(框架)。这是构造函数必须做的第一件事。然后,您可能需要设置初始宽度/高度,并将帧的背景颜色设置为绿色。

您需要添加一个鼠标侦听器,以便实际调用mouseClicked方法。然后让它将'MyPanel'对象添加到框架中,并调用repaint。

我认为这大致是你要去的。

+1

*“我认为这大致是你要去的。”*我认为你应该在公共写作之前测试想法。 *“你可能想要设置一个初始宽度/高度”*否,组件(包括像Mypanel这样的自定义组件应该覆盖getPreferredSize来返回一个合理的值,那么框架应该打包到这个尺寸。 “然后让它将'MyPanel'对象添加到框架中,并调用repaint。”*最好在启动时将面板添加到框架,然后简单地更改其状态(并在按钮被调用时调用repaint()点击 –

+1

没有理由编写'super()',如果不存在对其他构造函数的调用,它总是自动调用。 – VGR

1

提供的代码不会编译。为了更快地获得更好的帮助,请发送Minimal, Complete, and Verifiable exampleShort, Self Contained, Correct Example

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class Mypanel extends JPanel { 

    boolean clicked = false; 

    Mypanel() { 
     setBackground(Color.GREEN); 
     MouseListener mouseListener = new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       clicked = true; 
       repaint(); 
      } 
     }; 
     this.addMouseListener(mouseListener); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 100); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (clicked) { 
      g.drawOval(15, 15, 50, 50); 
     } 
    } 
} 

public class algo extends JFrame { 

    public algo() { 
     initComponents(); 
     pack(); 
     //jPanel1.setBackground(Color.GREEN); ?!? 
    } 

    protected final void initComponents() { 
     add(new Mypanel()); 
    } 

    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new algo().setVisible(true); 
      } 
     }); 
    } 
}