2013-01-06 109 views
0

我想開發一個Swing應用程序,它看起來像下面一個簡單的Swing應用程序: -需要幫助調試使用的JLayeredPane

enter image description here

(此應用程序的演示可以發現here

黑色方塊隨着光標的移動而移動。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()); 
} 
} 

請幫我找到問題所在。

+0

請編輯您的問題以引用[demo](http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html)。 – trashgod

回答

2

您的mouseMoved()實現不再應用原始中使用的偏移;您需要根據您的cursor中使用的Icon的幾何形狀來提供它們。

//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)); 

由於語言defines數組作爲Object,編譯器選擇了匹配可用add()方法:

public void add(Component comp, Object constraints); 
+0

:那麼有什麼問題,我不明白?如果我不使用xfudge和yfudge,它只會被輕微移位! –

+0

:其實有兩個愚蠢的錯誤。看我的答案。 –

1

有其消耗的我的11寶貴的時間二傻的錯誤。

1)我設置actionListener'遊標',而不是layeredPane,這就是爲什麼運動被限制在一個小區域。其次,我寫了layeredPane.add(label,new Integer[i]);而不是layeredPane.add(label,new Integer(i));(注意方括號)。

+0

但我不明白爲什麼我沒有得到任何錯誤,當我使用了錯誤的括號?任何人都可以指出原因。 –

+0

+1用於隨訪;更多[這裏](http://stackoverflow.com/a/14181243/230513)。 – trashgod