0

我有(JScrollPane)滚动,其中包含:

  • (JPanel) mainPanel (滚动大小)
    • (JPanel) boxPanel (boxPanel 添加到 mainPanel)
      • (ArrayList < JPanel >) rowPanel(List中的所有组件都添加到boxPanel中)

我希望 rowPanel 组件是可拖动的,并根据它们被拖动到的位置更新它们在 boxPanel 中的位置。

下面的代码适用于 java 7,但不适用于 java 8。

在 java 8 代码停止工作:

boxPanel.add(tempItem, temp);

每当我尝试添加被拖到 boxPanel 的 JPanel 时,程序都不会这样做。我没有收到任何错误或异常。我不明白为什么它不适用于 java 8。

private void handleDrag(final JPanel panel){

    panel.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent me) {
             panelY = me.getY();    
             panelNo = rowPanel.indexOf(panel);
             tempItem = rowPanel.get(panelNo);
        }
    });

   panel.addMouseMotionListener(new MouseMotionAdapter() {
      @Override
        public void mouseDragged(MouseEvent mep) {
            mep.translatePoint(0, mep.getComponent().getLocation().y - panelY);

 // get new position of row 

            int temp;

            if(((mep.getY() - panelY) / mep.getComponent().getSize().height) < 0){
                temp = 0;
            }
            else if(((mep.getY() - panelY) /  mep.getComponent().getSize().height) < (elementsAmount - 1)){
                double d = ((double)(mep.getY() - panelY) /  mep.getComponent().getSize().height + 1);
                temp = (int) Math.round(d);
                if(temp > (elementsAmount - 1)){
                    temp = elementsAmount - 1;
                }
            }
            else{
                temp = (elementsAmount - 1);
            }


// rowPanel ArrayList<JPanel> containing all rows within boxPanel
            rowPanel.remove(tempItem); 
            rowPanel.add(temp, tempItem);
// boxPanel JPanel with BoxLayout
            boxPanel.add(tempItem, temp);

            scroll.revalidate();
        }
    });
}
4

1 回答 1

2

您必须确保修改后Container得到重新验证和重新绘制,例如通过调用类似命名的方法。但一般来说,在鼠标事件处理过程中移除和添加组件是个坏主意。值得庆幸的是,您不必实现它那么复杂。这是一个简单的、独立的组件示例BoxLayout,可通过鼠标拖动重新排序:

JFrame frame=new JFrame("Box ordering test");
Box box=Box.createVerticalBox();
frame.setContentPane(box);
box.add(new JLabel("One"));
box.add(new JLabel("Two"));
box.add(new JLabel("Three"));
box.add(new JLabel("Four"));
box.add(new JLabel("Five"));
MouseMotionListener l=new MouseMotionAdapter() {
    @Override
    public void mouseDragged(MouseEvent e) {
        Component c=e.getComponent();
        Container p=c.getParent();
        int count = p.getComponentCount();
        int newPos=Math.max(0, Math.min(count,
            (e.getY()+c.getY())*count/p.getHeight()));
        if(newPos!=p.getComponentZOrder(c)) {
            p.setComponentZOrder(c, newPos);
            p.revalidate();
            p.repaint();
        }
    }
};
for(Component c: box.getComponents()) c.addMouseMotionListener(l);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
于 2015-03-12T15:42:42.617 回答