import javax.swing.*
import java.awt.event.*
public class Painter extends JFrame
{
private int xValue=0,yValue=0
public Painter()
{
super("A Simple paint program")
getContentPane().add(new JLabel("Drag the Mouse To Paint"),"South")
/*addMouseMotionListener(
new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e)
{
xValue=e.getX()
yValue=e.getY()
repaint()
}
}
)*/
setSize(300,300)
setVisible(true)
}
/*
public void paint(Graphics g)
{
g.fillOval(xValue,yValue,4,4)
}*/
public static void main(String[] args)
{
Painter frame=new Painter()
}
}
这主要是paint(Griphics g)方法的问题
注意java.awt包和javax.swing包中的类的层次问题
java.lang.Object ->java.awt.Component ->java.awt.Label
java.lang.Object
-> java.awt.Component
-> java.awt.Container
-> javax.swing.JComponent
-> javax.swing.JLabel
而在java.awt.Component和javax.swing.JComponent都分别根据组件的清重量级定义了不同实现方式的paint方法
在你的程序中,你是在JFrame中直接进行绘画,而JFrame属于重量级组件,Label属于偏重量级JLabel属于偏轻(轻重的区别就是是否跟本地系统有太大关系)。。JFrame JWindow JDialog 等等。。并且你绘画的区域和你添加Label
的位置有重叠。。。诸多原因导致了无法显示
建议:将绘画的组件 改成JPanel。。可以多分级绘画,也可以并列多个JPanel,然后分别添加 组件 和绘画,不会重叠。。
import java.awt.BasicStroke
import java.awt.BorderLayout
import java.awt.Color
import java.awt.FlowLayout
import java.awt.Frame
import java.awt.Graphics
import java.awt.Graphics2D
import java.awt.Label
import java.awt.Panel
import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent
import java.awt.event.MouseMotionListener
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
public class MouseDrawPanel extends Frame
{
private static final long serialVersionUID = 1L
MouseEvent e = null
int startX = -1
int startY = -1
int endX = -1
int endY = -1
boolean left = false
public MouseDrawPanel ( String title )
{
setTitle (title)
setLayout (new BorderLayout ())
setResizable (false)
setSize (500, 400)
setLocationRelativeTo (null)
addWindowListener (new WindowAdapter ()
{
@Override
public void windowClosing ( WindowEvent e )
{
System.exit (0)
}
})
}
@Override
public void paintComponents ( Graphics g )
{
float lineWidth = 8.0f
( (Graphics2D) g ).setStroke (new BasicStroke (lineWidth))
g.setColor (Color.YELLOW)
g.drawLine (startX, startY, endX, endY)
g.dispose ()
}
public static void main ( String[] args )
{
final MouseDrawPanel mdp = new MouseDrawPanel ("Use Mouse Draw")
Panel panel = new Panel ()
panel.setLayout (new FlowLayout (FlowLayout.LEFT))
Label startL = new Label ("start: ")
Label endL = new Label ("end: ")
final Label nowL = new Label ("now: ")
final Label startR = new Label ("000,000")
final Label endR = new Label ("000,000")
final Label nowN = new Label ("000,000")
panel.add (startL)
panel.add (startR)
panel.add (endL)
panel.add (endR)
panel.add (nowL)
panel.add (nowN)
mdp.add (panel, "South")
mdp.addMouseMotionListener (new MouseMotionListener ()
{
@Override
public void mouseMoved ( MouseEvent e )
{
if (mdp.left)
{
nowN.setText (e.getX () + " , " + e.getY ())
}
}
@Override
public void mouseDragged ( MouseEvent e )
{
if (mdp.left)
{
mdp.endX = e.getX ()
mdp.endY = e.getY ()
mdp.paintComponents (mdp.getGraphics ())
mdp.startX = mdp.endX
mdp.startY = mdp.endY
endR.setText (mdp.endX + " , " + mdp.endY)
}
}
})
mdp.addMouseListener (new MouseAdapter ()
{
@Override
public void mousePressed ( MouseEvent e )
{
if (e.getButton () == MouseEvent.BUTTON1)
{
mdp.startX = e.getX ()
mdp.startY = e.getY ()
startR.setText (mdp.startX + " , " + mdp.startY)
mdp.left = true
}
else
{
mdp.left = false
}
}
@Override
public void mouseReleased ( MouseEvent e )
{
if (mdp.left)
{
endR.setText (e.getX () + " , " + e.getY ())
}
}
})
mdp.setVisible (true)
}
}