我用 Java 编写了以下微型画笔程序:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
class AuxClass1 extends JFrame implements MouseListener, MouseMotionListener{
private JPanel panel1 = new JPanel();
private JPanel panel2 = new JPanel();
private JLabel label1_x = new JLabel();
private JLabel label1_y = new JLabel();
private JLabel label1_x_info = new JLabel("");
private JLabel label1_y_info = new JLabel("");
//add a container keep panels with widgets
private Container con1 = getContentPane();
private int xval1;
private int yval1;
private GridLayout layout1 = new GridLayout(2,2,2,2);
private JOptionPane info1 = new JOptionPane();
//get the class that controls the mouse
public AuxClass1(){
super("Mouse Experiment");
panel1.setBackground(Color.WHITE);
panel1.setLayout(layout1);
label1_x.setText("X Location");
label1_x.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
label1_y.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
label1_x_info.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
label1_y_info.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
label1_y.setText("Y Location");
panel1.add(label1_x);
panel1.add(label1_y);
panel1.add(label1_x_info);
panel1.add(label1_y_info);
con1.add(panel1, BorderLayout.NORTH);
panel2.setBackground(new Color(100,200,200));
panel2.setBorder(BorderFactory.createLineBorder(new Color(255,255,0), 2));
panel2.addMouseListener(this);
panel2.addMouseMotionListener(this);
con1.add(panel2, BorderLayout.CENTER);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500, 500);
setLocationRelativeTo(null);
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
if (arg0.getSource()==panel2){
x_var = arg0.getX();
y_var = arg0.getY();
label1_x_info.setText(Integer.toString(x_var));
label1_y_info.setText(Integer.toString(y_var));
}
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
if (e.getSource()==panel2){
//info1.showMessageDialog(this, "This is an awesome Mouse toolbox!");
xval1 = e.getX();
yval1= e.getY();
AuxClass2 Inst2 = new AuxClass2(xval1, yval1);
Inst2.paintComponent(getGraphics());
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
if (arg0.getSource()==panel2){
label1_x_info.setText("");
label1_y_info.setText("");
}
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
class AuxClass2 extends JPanel{
//JOptionPane info2 = new JOptionPane();
private int xval2;
private int yval2;
public AuxClass2(int input1, int input2){
xval2 = input1;
yval2 = input2;
setSize(500,500);
}
@Override
public void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.fillRect(xval2, yval2+70, 5, 5);
}
}
public class MainClass{
private static AuxClass1 Inst1;
public static void main(String args[]){
Inst1 = new AuxClass1();
}
}
除了 mouseDragged 方法的 Y 坐标外,它工作正常(参见 t3_aux2 类中的 paintComponent 方法)。由于某种原因,该方法使用的 Y 坐标比 panel2 中的实际 Y 坐标小约 70 像素。我怀疑这与 t3_aux2 类中继承的 JPanel 方法有关,但不太确定。
如果有人能澄清这一点,那就太酷了。谢谢。
UPD:如果有人对如何改进样式和/或优化代码有任何建议,那也将不胜感激。
UPD2:更改了名称以符合 Java 命名约定。