JLabel中的SetLocation

时间:2015-10-22 23:38:42

标签: java swing mouseevent jlabel

我的任务是点击时获得鼠标的位置,除了一件事我完成了很多:输出的位置。我应该在第一次点击时得到这个,但是只有双击才能获得正确的输出:

enter image description here

以下是第一次点击的内容,无论其位置如何:

enter image description here

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

public class Mouse {
public static void main(String[] args) {

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JLabel label = new JLabel();
    frame.add(panel);
    panel.add(label);
    panel.addMouseListener(new MouseAdapter() {
       @Override
        public void mouseClicked(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            label.setLocation(x,y);
            label.setText("(" + x + "," + y + ")");
        }
    });
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setVisible(true);
    }
 }

2 个答案:

答案 0 :(得分:4)

JPanel,但默认情况下,使用的是LayoutManager,通常我会阻止您尝试使用它,但在您的情况下,您可能无法选择。

通常情况下,我会考虑编写一个可以处理此问题的布局管理器,但这超出了要求的范围。

相反,首先将panel的布局管理器设置为null

JFrame frame = new JFrame();
JPanel panel = new JPanel(null);

现在您已经完成了这项工作,您对组件的管理完全负责,关于它的大小和位置,因此,当调用mouseClicked时,您需要设置例如,标签的textlocationsize

panel.addMouseListener(new MouseAdapter() {
   @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        label.setLocation(x,y);
        label.setText("(" + x + "," + y + ")");
        label.setSize(label.getPreferredSize());
    }
});

仔细查看Laying Out Components Within a Container,了解有关布局管理器API的功能及其工作原理的更多详细信息

答案 1 :(得分:3)

选项2是在JPanel的paintComponent方法中显示文本。这样您就不必担心使用可怕的null布局管理器了。例如:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class MousePosition extends JPanel {
    private static final int PREF_W = 600;
    private static final int PREF_H = PREF_W;
    // format String for display String
    protected static final String FORMAT = "(%d, %d)";
    private int xPos = -40;
    private int yPos = -40;
    private String displayText = "";

    public MousePosition() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                xPos = e.getX();
                yPos = e.getY();
                // use FORMAT String to create our display text
                displayText = String.format(FORMAT, xPos, yPos);
                repaint();
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(displayText, xPos, yPos);

    }

    private static void createAndShowGui() {
        MousePosition mainPanel = new MousePosition();

        JFrame frame = new JFrame("MousePosition");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}