gpt4 book ai didi

java - 如何防止JLabel位置重置?

转载 作者:行者123 更新时间:2023-12-02 06:18:24 25 4
gpt4 key购买 nike

我有一个包含 11 个 JLabel 的 JPanel,每个 JLabel 都使用 MouseMotionListener 注册,如下所示(由 Netbeans 生成):

label1.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseMotionEvent evt){
label1MouseDragged(evt);
}

各个 labelXMouseDragged 方法包含(例如):

label1.setLocation(label1.getParent().getMousePosition());

该面板与其他各种控件一起位于另一个面板内。我发现我可以在面板内很好地拖动标签(我的方法正确地检查了边界,但为了简单起见,我将它们保留为上面的样子)。但是,如果在非控件的任意位置单击鼠标(无论是在内部面板内还是在父面板内),标签的位置都会重置。是什么原因导致这种情况发生?我没有在其他地方注册任何类型的鼠标监听器,如果我自己制作这个面板,我似乎没有点击问题。

最佳答案

您可以通过使用 null layout 来实现此目的,但我对 null 布局有一种病态的厌恶,它们出了太多问题。

Swing API 基于布局组件时布局管理器的使用。

相反,您可以创建一个布局管理器,其唯一职责是尊重它所​​管理的组件的位置

AbsoluteLayout

这样做的基本好处是您无需担心调整组件的大小,并且它将响应父容器及其周围容器的更改,而无需添加其他监听器。

您甚至可以在 layoutContainer 中设计边界检查,以确保组件保持在边界内

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.LayoutManager2;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AbsoluteLayoutExample {

public static void main(String[] args) {
new AbsoluteLayoutExample();
}

public AbsoluteLayoutExample() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {

setLayout(new AbsoluateLayoutManager());

JLabel test = new JLabel("Test");
add(test);

MouseAdapter ma = new MouseAdapter() {

private Point offset;
private Component dragComp;

@Override
public void mousePressed(MouseEvent e) {
Point point = e.getPoint();
for (Component comp : getComponents()) {
if (comp.getBounds().contains(point)) {
offset = new Point(point.x - comp.getX(), point.y - comp.getY());
dragComp = comp;
}
}
}

@Override
public void mouseReleased(MouseEvent e) {
offset = null;
dragComp = null;
}

@Override
public void mouseDragged(MouseEvent e) {
if (dragComp != null) {
Point p = e.getPoint();
Point dragP = new Point(p.x - offset.x, p.y - offset.y);
dragComp.setLocation(dragP);
}
}

};

addMouseListener(ma);
addMouseMotionListener(ma);

}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

}

public class AbsoluateLayoutManager implements LayoutManager2 {

@Override
public void addLayoutComponent(Component comp, Object constraints) {
}

@Override
public Dimension maximumLayoutSize(Container target) {
return preferredLayoutSize(target);
}

@Override
public float getLayoutAlignmentX(Container target) {
return 0.5f;
}

@Override
public float getLayoutAlignmentY(Container target) {
return 0.5f;
}

@Override
public void invalidateLayout(Container target) {
}

@Override
public void addLayoutComponent(String name, Component comp) {
}

@Override
public void removeLayoutComponent(Component comp) {
}

@Override
public Dimension preferredLayoutSize(Container parent) {
int maxX = 0;
int maxY = 0;
for (Component comp : parent.getComponents()) {
Dimension size = comp.getPreferredSize();
maxX = Math.max(comp.getX() + size.width, maxX);
maxY = Math.max(comp.getY() + size.height, maxY);
}

return new Dimension(maxX, maxY);
}

@Override
public Dimension minimumLayoutSize(Container parent) {
return preferredLayoutSize(parent);
}

@Override
public void layoutContainer(Container parent) {
for (Component comp : parent.getComponents()) {
Dimension size = comp.getPreferredSize();
comp.setSize(size);
}
}

}

}

您也可以考虑这样的事情 example这是基于“百分比”的约束来布局组件,因此它们始终位于容器内给定的百分比点

关于java - 如何防止JLabel位置重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com