Перемещение компонентов и некорректное их отображение - Java
Формулировка задачи:
Доброго времени суток!
Делаю простое приложение, где при нажатии, ведению мышки и отпускании добавляется панель (ShapePanel), на которой рисуется фигура (в данном случае - прямоугольник). Есть несколько проблем: 1) При добавлении на панель новой фигуры (т.е. панели с фигурой на ней) фон получается "прозрачным", хотя в конфигурации класса (ShapePanel) прописан СИНИЙ цвет. Что влияет на подобный результат и как это "исправить"?) 2) Также пытаюсь написать механизм перемещения фигур (т.е. панелей с фигурами) мышкой. Проблема в том, что обработчик не заходит в mouseDragged метод (что является жизненно важным для механизма перетаскивания). Почему?Буду рад любым идеям и советам по улучшению следующего кода!
Класс общей (главной) панели:public class PPanel extends JPanel
{
public PPanel()
{
setLayout(null);
setBounds(0, 0, 600, 600);
setBackground(Color.PINK);
MouseAction ma = new MouseAction();
addMouseListener(ma);
addMouseMotionListener(ma);
add(new ShapePanel(new Point(20,20), new Point(100,100)));
}
public void createShape(ShapePanel panel)
{
add(panel);
//repaint();
//invalidate();
updateUI();
}
private class MouseAction extends MouseAdapter
{
boolean creation = false;
Point p1, p2;
public MouseAction()
{
p1 = new Point();
p2 = new Point();
}
@Override
public void mousePressed(MouseEvent event)
{
if (!creation)
{
creation = true;
p1.x = event.getX();
p1.y = event.getY();
}
}
@Override
public void mouseDragged(MouseEvent event)
{
if (creation)
{
p2.x = event.getX();
p2.y = event.getY();
}
}
@Override
public void mouseReleased(MouseEvent event)
{
if (creation)
{
p2.x = event.getX();
p2.y = event.getY();
createShape(new ShapePanel(p1, p2));
creation = false;
}
}
}
}public class ShapePanel extends JPanel
{
Point p1, p2;
public ShapePanel(Point p1, Point p2)
{
this.p1 = p1;
this.p2 = p2;
setLayout(null);
setBounds(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
setBackground(Color.BLUE);
setMoveListener(this);
setVisible(true);
}
@Override
public void paint(Graphics g)
{
Graphics2D gg = (Graphics2D) g;
gg.setStroke(new BasicStroke(5));
gg.drawRect(0, 0, this.getWidth(), this.getHeight());
}
private void setMoveListener(final JComponent j)
{
j.addMouseListener(new MouseAdapter()
{
private Point currPos;
private Point mousePos;
private Component comp;
@Override
public void mousePressed(MouseEvent e)
{
//prevLoc = e.getPoint();
comp = (Component) e.getSource();
mousePos = comp.getParent().getMousePosition();
//currPos = comp.getLocation();
}
@Override
public void mouseDragged(MouseEvent e)
{
/*Component comp = (Component) e.getSource();
comp.setLocation((int) ( comp.getX() + (e.getX()-prevLoc.getX()) ),
(int) ( comp.getY() + (e.getY()-prevLoc.getY())) );
prevLoc = e.getPoint();*/
currPos = comp.getLocation();
Container c = comp.getParent();
Point mouse = c.getMousePosition();
if (mouse.x > mousePos.x)
currPos.x++;
else if (mouse.x < mousePos.x)
currPos.x--;
if (mouse.y > mousePos.y)
currPos.y++;
else if (mouse.y < mousePos.y)
currPos.y--;
mousePos = mouse;
}
@Override
public void mouseReleased(MouseEvent e)
{
//prevLoc = null;
comp.setLocation(currPos);
comp = null;
currPos = null;
}
});
}
}
Код фрейма:
public class PFrame extends JFrame
{
public PFrame()
{
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 100, 600, 600);
add(new PPanel());
setVisible(true);
}
}Решение задачи: «Перемещение компонентов и некорректное их отображение»
textual
Листинг программы
import javax.swing.*;
public class PFrame extends JFrame
{
public PFrame()
{
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 100, 600, 600);
add(new PPanel());
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PFrame();
}
});
}
}