Olá: Criei um programinha (no JBuilder) em que ao clicar o mouse em uma posição do JPanel, além de fornecer a posição do mouse, também desenha um ponto nesta posição. Os valores da posição do Mouse parecem OK, o mesmo quanto à posiçao X do ponto. O problema é quanto a coordenada Y do ponto: este aparece sempre uns pixels acima da posição do mouse. Em termos de programação a coordenada Y do ponto é menos que a coordenada Y do Mouse. Tenho quase a certeza que esta diferença é igual a altura da barra de título. Ele funciona da seguinte forma: nos eventos MouseDragged e MouseEvent, seus respectivos métodos que os manipulam chamam o método criaPonto(MouseEvent) que passa as coordenadas do mouse para dois atributos globais (x, y) e depois chama o método repaint(). Como todos sabem, este chama paint(Graphics). Neste método é criado um retangulo através de g.drawRect(x, y, 1, 1). (A propósito alguém conhece algum método melhor de se pintar um pixel na tela do que este?) Agradeço qualquer dica.
Grato, Rafael U. C. Afonso A seguir disponibilizo os códigos-fontes do programa. Se acharem que há coisa demais nele a culpa é do JBuilder fica criando essas coisas. package testegrafico; import javax.swing.UIManager; import java.awt.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: </p> * @author unascribed * @version 1.0 */ public class MousePonto { boolean packFrame = false; //Construct the application public MousePonto() { PintaPonto frame = new PintaPonto(); //Validate frames that have preset sizes //Pack frames that have useful preferred size info, e.g. from their layout if (packFrame) { frame.pack(); } else { frame.validate(); } //Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } //Main method public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } new MousePonto(); } } package testegrafico; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: </p> * @author unascribed * @version 1.0 */ public class PintaPonto extends JFrame { JPanel contentPane; JLabel statusBar = new JLabel(); BorderLayout borderLayout1 = new BorderLayout(); JPanel pnlTela = new JPanel(); int x, y; //Construct the frame public PintaPonto() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage (PintaPonto.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); titledBorder1 = new TitledBorder(""); border1 = BorderFactory.createEtchedBorder(Color.white,new Color(142, 142, 142)); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Exibição de Pontos do Mouse"); statusBar.setBorder(border1); statusBar.setText(" "); pnlTela.addMouseMotionListener(new PintaPonto_pnlTela_mouseMotionAdapter (this)); pnlTela.addMouseListener(new PintaPonto_pnlTela_mouseAdapter(this)); contentPane.add(statusBar, BorderLayout.SOUTH); contentPane.add(pnlTela, BorderLayout.CENTER); } //Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } void pnlTela_mouseMoved(MouseEvent e) { } void pnlTela_mousePressed(MouseEvent e) { criaPonto(e); } public void paint(Graphics g) { g.drawRect(x, y, 1, 1); } void pnlTela_mouseDragged(MouseEvent e) { criaPonto(e); } void criaPonto(MouseEvent e) { x = e.getX(); y = e.getY(); java.text.DecimalFormat df = new java.text.DecimalFormat("000"); statusBar.setText("X = " + df.format(x) + ", Y = " + df.format(y)); this.repaint(); } private TitledBorder titledBorder1; private Border border1; } class PintaPonto_pnlTela_mouseMotionAdapter extends java.awt.event.MouseMotionAdapter { private PintaPonto adaptee; PintaPonto_pnlTela_mouseMotionAdapter(PintaPonto adaptee) { this.adaptee = adaptee; } public void mouseMoved(MouseEvent e) { adaptee.pnlTela_mouseMoved(e); } public void mouseDragged(MouseEvent e) { adaptee.pnlTela_mouseDragged(e); } } class PintaPonto_pnlTela_mouseAdapter extends java.awt.event.MouseAdapter { private PintaPonto adaptee; PintaPonto_pnlTela_mouseAdapter(PintaPonto adaptee) { this.adaptee = adaptee; } public void mousePressed(MouseEvent e) { adaptee.pnlTela_mousePressed(e); } } ------------------------------ LISTA SOUJAVA ---------------------------- http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -------------------------------------------------------------------------