0

私は次のようなスイングアプリケーションを開発しようとしています:-

ここに画像の説明を入力してください

(このアプリケーションのデモはここにあります)

カーソルを移動すると、黒い正方形が移動します。ComboBoxエントリは、スタックの最上位のレイヤーを選択します。その上に移動中に正方形が表示されますが、残りの次の最上位レイヤーの下に表示されます。

ほぼ完成しましたが、マウスを動かすと黒い四角(画像)が振動し(動きがスムーズではない)、動きが狭い領域に限定され、完全なレイヤードペイン上を移動しません。また、変更の影響はありません。 ComboBoxまたはCheckBoxの設定。

ここにコードがあります:-

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class JLayeredPaneDemo implements ActionListener, MouseMotionListener{
private String layerString[]={"Red(0)","Yellow(1)","Blue(2)","Green(3)","Orange(4)"};
private Color layerColors[]={Color.RED,Color.YELLOW,Color.BLUE,Color.GREEN,Color.ORANGE};
JComboBox jcb;
JCheckBox jcheck;
JLayeredPane layeredPane;
ImageIcon img;
JLabel cursor;

public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){public void run(){new JLayeredPaneDemo();}});
}

public JLayeredPaneDemo()
{
JFrame frame=new JFrame("JLayeredPane Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2,1));

frame.add(createControlPanel());
//frame.add(Box.createRigidArea(new Dimension(0, 10)));
frame.add(createLayeredPane());

try
{
    img=new ImageIcon(ImageIO.read(new File("src/watermark.png")));
}catch(IOException e){System.out.println("ERROR LOADING IMAGE :"+ e);}
cursor=new JLabel(img);
cursor.setBounds(45,45,img.getIconWidth(),img.getIconHeight());
cursor.addMouseMotionListener(this);
layeredPane.add(cursor,new Integer(2),0);

frame.pack();
frame.setVisible(true);
}

public JPanel createControlPanel()
{
JPanel panel=new JPanel();
panel.setBorder(BorderFactory.createTitledBorder("Select the Settings"));

jcb=new JComboBox(layerString);
jcb.setSelectedIndex(0);
jcb.setActionCommand("LAYER_SETTING");
jcb.addActionListener(this);

jcheck=new JCheckBox();
jcheck.setSelected(true);
jcheck.setActionCommand("FRONT_BACK");
jcheck.addActionListener(this);

panel.add(jcb);
panel.add(jcheck);

return panel;
}

public JLayeredPane createLayeredPane()
{
layeredPane=new JLayeredPane();
layeredPane.setBorder(BorderFactory.createTitledBorder("Layered Pane : Move Your Mouse"));
layeredPane.setPreferredSize(new Dimension(300,310));

Point origin=new Point(20,20);
int offset=35;

for(int i=0;i<layerString.length;i++)
{
    JLabel label=createColoredLabel(layerString[i],layerColors[i],origin);
    layeredPane.add(label,new Integer[i]);
    origin.x+=offset;
    origin.y+=offset;
}

return layeredPane;
}

private JLabel createColoredLabel(String str,Color color,Point origin)
{
JLabel label =new JLabel(str);
label.setVerticalAlignment(JLabel.TOP);
label.setHorizontalAlignment(JLabel.CENTER);
label.setOpaque(true);
label.setBackground(color);
label.setForeground(Color.BLACK);
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
label.setBounds(origin.x,origin.y,100,100);

return label;
}
public void actionPerformed(ActionEvent e)
{
String cmd=e.getActionCommand();
if(cmd.equals("LAYER_SETTING"))
{
    int position=jcheck.isSelected() ? 0 :1;
        layeredPane.setLayer(cursor,jcb.getSelectedIndex(),position);
}
else if(cmd.equals("FRONT_BACK"))
{
    if(jcheck.isSelected())
        layeredPane.moveToFront(cursor);
    else
        layeredPane.moveToBack(cursor);
}
}

@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
//Do nothing
}

@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
cursor.setLocation(e.getX(),e.getY());
}
}

問題を見つけるのを手伝ってください。

4

2 に答える 2

2

あなたのmouseMoved()実装は、オリジナルで使用されていたオフセットを適用しなくなりました。Iconで使用されるのジオメトリに基づいてそれらを指定する必要がありますcursor

//Adjustments to put Duke's toe at the cursor's tip.
private static final int XFUDGE = 40;
private static final int YFUDGE = 57;
...
//Make Duke follow the cursor.
public void mouseMoved(MouseEvent e) {
    dukeLabel.setLocation(e.getX()-XFUDGE, e.getY()-YFUDGE);
}

補遺:間違ったブラケットを使用したときにエラーが発生しなかった理由がわかりません。誰か理由を指摘してください。

layeredPane.add(label,new Integer(i));

言語は配列を として定義Objectするため、コンパイラは一致する使用可能なadd()メソッドを選択しました。

public void add(Component comp, Object constraints);
于 2013-01-06T10:26:32.720 に答える
1

私の貴重な 11 時間を費やした 2 つのばかげたミスがあります。

1)layeredPane の代わりに「cursor」に actionListener を設定したため、動きが小さな領域に制限されました。

2) 第二に、.(角括弧に注意してください) のlayeredPane.add(label,new Integer[i]);代わりに書きました。layeredPane.add(label,new Integer(i));

于 2013-01-06T14:52:16.683 に答える