在 java8 上将拖动的组件添加到 JPanel
adding dragged component to JPanel on java8
我有 (JScrollPane) 滚动条,其中包含:
- (JPanel) mainPanel (滚动大小)
- (JPanel) boxPanel(boxPanel添加到mainPanel)
- (ArrayList < JPanel >) rowPanel (List中的所有组件都添加到boxPanel中)
我希望 rowPanel 组件可以拖动并根据它们被拖动到的位置更新它们在 boxPanel 中的位置。
下面的代码适用于 java 7,但不适用于 java 8。
On 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();
}
});
}
您必须确保修改后的 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);
我有 (JScrollPane) 滚动条,其中包含:
- (JPanel) mainPanel (滚动大小)
- (JPanel) boxPanel(boxPanel添加到mainPanel)
- (ArrayList < JPanel >) rowPanel (List中的所有组件都添加到boxPanel中)
- (JPanel) boxPanel(boxPanel添加到mainPanel)
我希望 rowPanel 组件可以拖动并根据它们被拖动到的位置更新它们在 boxPanel 中的位置。
下面的代码适用于 java 7,但不适用于 java 8。
On 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();
}
});
}
您必须确保修改后的 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);