Перемещение компонентов и некорректное их отображение - 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(); } }); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д