Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel中的SetLocation_Java_Swing_Mouseevent_Jlabel - Fatal编程技术网

Java JLabel中的SetLocation

Java JLabel中的SetLocation,java,swing,mouseevent,jlabel,Java,Swing,Mouseevent,Jlabel,我的任务是在点击鼠标时获取鼠标的位置,除了一件事:我的输出的位置,我几乎完成了。我应该在第一次单击时获得此信息,但只有在双击时才能获得正确的输出: 以下是我第一次点击时得到的信息,与位置无关: JPanel,但是默认情况下,它使用的是LayoutManager,通常我会阻止您尝试使用它,但在您的情况下,您可能没有选择 通常,我会考虑编写一个布局管理器来处理这个问题,但这超出了需求范围。 相反,首先将面板的布局管理器设置为null JFrame frame = new JFrame(); JP

我的任务是在点击鼠标时获取鼠标的位置,除了一件事:我的输出的位置,我几乎完成了。我应该在第一次单击时获得此信息,但只有在双击时才能获得正确的输出:

以下是我第一次点击时得到的信息,与位置无关:


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

通常,我会考虑编写一个布局管理器来处理这个问题,但这超出了需求范围。

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

JFrame frame = new JFrame();
JPanel panel = new JPanel(null);
现在您已经这样做了,您将完全负责管理组件的大小和位置,因此,当调用
mouseClicked
时,您需要设置标签的
文本
位置
大小

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());
    }
});

更详细地了解布局管理器API的功能和工作原理

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

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();
            }
        });
    }
}

问题是,我们刚刚开始使用可视化编程,所以这段代码对于我们正在做的事情来说有点复杂。不过还是要谢谢你,等我进步了,我会再回来的!
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();
            }
        });
    }
}