简而言之,我想将 a 的文本设置为( )JLabel
中的 a的文本,然后将屏幕从另一个( )中的另一个拖动到另一个上。JTextField
JPanel
pnlUser
JLabel
JPanel
JTextField
JPanel
pnlGrid
这是详细信息。
我写了一个“Solitaire Scrabble”程序。用户可以将文本光标定位在网格单元格中(a JTextField
in pnlGrid
)并键入“用户字母”列表中的字母(a JTextField
in pnlUser
),或者用户可以模拟从“用户字母”中拖动一个字母并将其放下中的目标网格单元格pnlGrid
。
我说“模拟”是因为所选字母实际上并未在屏幕上拖动。我使用鼠标指针HAND_CURSOR
使拖放尽可能真实,但我还没有弄清楚如何HAND_CURSOR
“抓住”字母并将字母物理拖过板子到目的地。
HAND_CURSOR
实际上,在拖动操作期间沿网格移动时,字母被突出显示但留在“用户字母”区域中。当它到达目标单元格pnlGrid
并释放鼠标按钮时,该字母会从“用户字母”中删除,并突然出现在网格单元格中。
所以这封信或多或少地从“用户信件”“传送”(让我向上,斯科蒂)到一个网格单元。这太抽象了。我希望用户字母位于 HAND_CURSOR 手指的尖端,并沿着网格拖动到将被放置的网格单元格中,如下面的 3 张图片所示。
我已经使用 JLayeredPane 在一个小型测试程序(以下来源)中成功实现了它,但我无法在游戏中实现它。但是直到两天前我才对 JLayeredPane 一无所知,所以我真的不知道我在做什么。(我改编了一个演示 JLayeredPane 的 Oracle 教程程序。)
我刚刚阅读了“玻璃窗格”,并认为它可能更容易实现,直到我下载了该演示的源代码,这很长,所以因为它是全新的,而且更难适应。
所以我想在我花更多时间沮丧之前,我应该问:
一种JLayeredPane
或一种setGlassPane
方法是否合适?有没有更简单或更好的方法将一个JLabel
从一个JPanel
拖到另一个JPanel
?
(程序中的方法是确定指向哪个“用户字母”,将该字母存储在 aJLabel
中,然后确保指尖正好位于字母的底部中心。mouseDragged
)HAND_CURSOR
package mousemoveletter;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import static java.awt.Color.*;
import java.awt.event.*;
import static javax.swing.SwingUtilities.invokeLater;
public class LayeredPaneDemo extends JPanel
{
private static final int USER7 = 7;
static Cursor HAND = new Cursor(Cursor.HAND_CURSOR);
static Cursor ARROW = new Cursor(Cursor.DEFAULT_CURSOR);
private static JLayeredPane layeredPane;
private static JLabel lblToMove;
private static JPanel pnlUser;
private static JPanel pnlGrid;
private static final JTextField[] txtUser = new JTextField[USER7];
public LayeredPaneDemo() // constructor
{
pnlGrid = new JPanel();
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new Dimension(240, 240));
pnlGrid.setSize(140, 140);
pnlGrid.setBorder(new EtchedBorder(RED, GREEN));
pnlGrid.setBackground(YELLOW);
lblToMove = new JLabel("XXX");
lblToMove.setSize(new Dimension(40,40));
layeredPane.add(pnlGrid, 0,0);
layeredPane.add(lblToMove, new Integer(0), -1);
add(layeredPane);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("LayeredPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new LayeredPaneDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
makeUser();
frame.add(pnlUser);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
invokeLater(new Runnable()
{
public void run() {
createAndShowGUI();
}
});
}
private static void makeUser(){
pnlUser = new JPanel(new GridLayout(1,USER7));
pnlUser.setPreferredSize(new Dimension(225, 50));
pnlUser.setBackground(Color.green);
pnlUser.setBorder(BorderFactory.createLineBorder(Color.BLUE));
for(int k = 0; k < USER7; k++)
{
txtUser[k] = new JTextField("" + (char)(Math.random()*26+65));
txtUser[k].setName("" + k);
txtUser[k].setEditable(false);
txtUser[k].addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
lblToMove.setCursor(HAND);
int w = Integer.parseInt(e.getComponent().getName());
lblToMove.setText(txtUser[w].getText());
layeredPane.setLayer(lblToMove, 0, 0);
lblToMove.setLocation(e.getX() + (e.getComponent().getWidth())*w,
e.getY() + layeredPane.getHeight() - e.getComponent().getHeight()/2);
};
});
txtUser[k].addMouseListener(new MouseAdapter()
{
public void mouseReleased(MouseEvent e)
{
lblToMove.setCursor(ARROW);
}
});
pnlUser.add(txtUser[k]);
}
}
}