我正在嘗試拖動 JFrame 上的 JPanel 內的 JComponents,或者更好地拖動 JFrame 的 rootPane 上的 JComponents。
包含組件的 JPanel 使用水平 BoxLayout。
當我運行下面的代碼時,我觀察到以下問題:
- MouseListener 和 MouseMotionListener 僅適用于 JLabel
- JLabel 似乎不可見
- 在嘗試拖動時,一旦我將滑鼠懸停在拖動 JButton 的位置上,帶有 JTextfield 和 JButton 內的 JComponents 的 JPanel 就會消失,它再次變得可見。
我在這里做錯了什么?這么少的代碼和這么多意想不到的問題。
請幫忙!
重現問題的代碼:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class Main extends JFrame implements MouseListener, MouseMotionListener {
private volatile int screenX = 0;
private volatile int screenY = 0;
private volatile int myX = 0;
private volatile int myY = 0;
private JPanel myPane;
public Main() {
setSize(500,500);
myPane = new JPanel();
//myPane.setLayout(new BoxLayout(myPane, BoxLayout.X_AXIS));
JTextField tf = new JTextField("Some text");
tf.setEnabled(false);
tf.setSize(110,20);
JLabel l = new JLabel("°C");
l.setSize(40,20);
JButton b = new JButton("Button");
myPane.setSize(new Dimension(tf.getWidth() l.getWidth(), tf.getHeight()));
myPane.add(tf);
myPane.add(l);
myPane.add(b);
rootPane.add(myPane);
myPane.addMouseListener(this);
myPane.addMouseMotionListener(this);
}
public static void main(String[] args) {
Main f = new Main();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
screenX = e.getXOnScreen();
screenY = e.getYOnScreen();
myX = myPane.getX();
myY = myPane.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Entered");
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
// only move when edit mode selected
System.out.println("Dragged");
int deltaX = e.getXOnScreen() - screenX;
int deltaY = e.getYOnScreen() - screenY;
myPane.setLocation(myX deltaX, myY deltaY);
revalidate();
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
uj5u.com熱心網友回復:
不要將組件添加到根窗格。還有其他組件將添加到頂部并覆寫您的組件。
面板應該添加到內容窗格中,并且內容窗格在拖動組件時需要使用空布局。
閱讀 Swing 教程中有關使用頂級容器的部分。還有一個鏈接可以在根窗格上進行更詳細的說明。正如您將看到的,內容窗格覆寫了根窗格。
您還可以查看移動視窗的基本拖動部分提供了一個簡單的可重用類,可用于拖動任何組件,因此您無需在類中硬編碼變數名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511848.html
標籤:爪哇摇摆
