JLabel
つまり、 a のテキストを a の a のテキストに設定しJTextField
( JPanel
) 、画面を横切って別の( )pnlUser
にドラッグします。JLabel
JPanel
JTextField
JPanel
pnlGrid
詳細はこちら。
「ソリティア スクラブル」プログラムを作成しました。ユーザーは、テキスト カーソルをグリッド セルに配置し ( の a)、「ユーザー文字」のリストにある文字を入力するかJTextField
(pnlGrid
の a ) JTextField
、pnlUser
または「ユーザー文字」から文字をドラッグ アンド ドロップすることをシミュレートできます。の宛先グリッド セルに挿入しますpnlGrid
。
選択した文字が実際に画面上でドラッグされないため、「シミュレート」と言いました。マウスポインターを使用して、ドラッグ/ドロップを可能な限りリアルにしますが、文字を「つかむ」方法と、ボード全体で文字を物理的に目的地までドラッグHAND_CURSOR
する方法がわかりません。HAND_CURSOR
HAND_CURSOR
そのまま、ドラッグ操作中に文字がグリッドに沿って移動している間、文字は強調表示されますが、「ユーザー文字」領域に残ります。目的のセルに到達しpnlGrid
てマウス ボタンを離すと、文字が「ユーザー文字」から消去され、グリッド セルに突然表示されます。
したがって、手紙は多かれ少なかれ「ユーザーレター」からグリッドセルに「テレポート」されます(スコッティ、私を転送してください)。これは抽象的すぎる。下の 3 つの図に示すように、ユーザー文字を HAND_CURSOR の人差し指の先に置き、グリッドに沿ってドロップされるグリッド セルにドラッグします。
JLayeredPane を使用して小さなテスト プログラム (以下のソース) で問題なく実行できましたが、ゲームでは実行できません。しかし、私は 2 日前まで JLayeredPane について何も知らなかったので、自分が何をしているのかよくわかりません。(JLayeredPane のデモを行う Oracle チュートリアル プログラムを採用しました。)
「ガラス板」について読んだばかりで、そのデモのソースをダウンロードするまで実装する方が簡単かもしれないと思った.
ですから、フラストレーションの中でこれ以上何時間も過ごす前に、次のことを尋ねるべきだと思いました。
JLayeredPane
またはsetGlassPane
アプローチは適切ですか?JLabel
あるものJPanel
から別のものにドラッグするより簡単またはより良い方法はありJPanel
ますか?
(プログラムのアプローチは、どの「ユーザー文字」が指されているかを判断し、その文字を に保存し、指先が文字の下部中央にあるJLabel
ことを確認することです。)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]);
}
}
}