【发布时间】:2014-12-04 23:43:50
【问题描述】:
我正在开发一个程序,它接受输入名称并创建 JLabels 并将它们填充到 ArrayList 中。当用户单击 Begin 按钮时,JLabels 将填充在左侧 JPanel 中。我一直在尝试使用 DnD 来允许用户在左侧面板中拖动和重新排序标签。到目前为止,我只能将文本从一个标签复制到另一个标签。我的目标是在列表中向上或向下拖动标签,并根据它在 JPanel 中的放置位置,让剩余的 JLabels 在面板中向上或向下移动。我正在为面板使用 FlowLayout,并且标签足够宽以创建垂直对齐。这是我的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.border.Border;
public class Gui extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private ArrayList<JLabel> players = new ArrayList<JLabel>();
private ArrayList<JLabel> monsters = new ArrayList<JLabel>();
private JButton addPlayer = new JButton();
private JButton removePlayer = new JButton();
private JButton addMonster = new JButton();
private JButton removeMonster = new JButton();
private JTextField name = new JTextField();
private JPanel listPanel = new JPanel();
private JPanel buttonPanel = new JPanel();
private JButton encounter = new JButton();
private JButton begin = new JButton();
//private JButton remove;// = new JButton();
int x_pressed;
int y_pressed;
public Gui(){
super("D&D Initiative");
final Container container = getContentPane();
container.setLayout(new FlowLayout()); //change to GridBagLayout
container.setPreferredSize(new Dimension(800, 500));
listPanel.setPreferredSize(new Dimension(600, 500));
listPanel.setBackground(Color.BLUE);
listPanel.setOpaque(true);
buttonPanel.setPreferredSize(new Dimension(200,500));
buttonPanel.setBackground(Color.GREEN);
buttonPanel.setOpaque(true);
Dimension size = new Dimension(190,30);
name.setPreferredSize(new Dimension(190,30));
addPlayer.setText("Add Player");
removePlayer.setText("Remove Player");
addPlayer.setPreferredSize(size);
removePlayer.setPreferredSize(size);
addMonster.setText("Add Monster");
removeMonster.setText("Remove Monster");
addMonster.setPreferredSize(size);
removeMonster.setPreferredSize(size);
begin.setText("Begin Encounter");
begin.setPreferredSize(size);
buttonPanel.add(name);
buttonPanel.add(addPlayer);
buttonPanel.add(addMonster);
buttonPanel.add(removePlayer);
buttonPanel.add(removeMonster);
buttonPanel.add(begin);
final Border paddingBorder = BorderFactory.createEmptyBorder(0,10,0,0);
addPlayer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(name.getText().compareToIgnoreCase("") != 0){
final JLabel temp=new JLabel();
temp.setPreferredSize(new Dimension(590,50));
temp.setText(name.getText());
temp.setBackground(Color.GRAY);
temp.setForeground(Color.WHITE);
temp.setOpaque(true);
temp.setLayout(new BorderLayout());
temp.setBorder(BorderFactory.createCompoundBorder(null,paddingBorder));
//bPane.setPreferredSize(new Dimension(100,temp.getHeight()));
JButton remove = new JButton();
remove.setText("Remove");
remove.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Count of listeners: " + ((JButton) e.getSource()).getActionListeners().length); //debugging
listPanel.remove(temp);
listPanel.revalidate();
System.out.println("remove");
listPanel.repaint();
}
});
temp.add(remove, BorderLayout.EAST);
MouseListener listener = new DragMouseAdapter();
temp.setTransferHandler(new TransferHandler("text"));
temp.addMouseListener(listener);
players.add(temp);
name.setText("");
name.requestFocusInWindow();
}else{
//throw error
}
}
});
begin.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
for(int i=0;i<players.size();i++){
JLabel h = players.get(i);
h.setMinimumSize(new Dimension(590,30));
int s = container.getHeight()/players.size();
if(s < 50){
h.setPreferredSize(new Dimension(590,listPanel.getHeight()/(players.size()+1)));
}else{
h.setPreferredSize(new Dimension(590,30));
}
listPanel.add(h, new Integer(1), 0);
}
listPanel.revalidate();
}
});
container.add(listPanel);
container.add(buttonPanel);
pack(); // pack the frame to fit the container inside
setLocation(150, 150); // set the location on the monitor
setVisible(true);
setResizable(false);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Gui application = new Gui();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//start of drag and drop
class DragMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent) e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.COPY);
System.out.println(c);
}
}
其中仍有一些来自不同尝试的东西(例如未使用的变量)。
【问题讨论】:
-
请不要发布您的整个程序,而是发布最小的可编译和可运行的程序,以向我们展示您的问题。否则你对这个网站上的志愿者要求太多了。不过,我的主要问题是,为什么不简单地使用按照tutorial demo 实现 D&D 的 JList?
-
改用
JList,它内置了这个功能 -
@MadProgrammer:是的,教程甚至展示了如何用一两个列表来做到这一点。
-
我试图远离 JList,因为我想展示列表的方式,但经过一番考虑,我打算将其更改为 JList。感谢您的快速回复!
标签: java swing drag-and-drop jlabel