Java problem z Drag

0

Witam, mam pewien problem z aplikacją okienkową. Chciałbym użyć metody do przesuwania obiektów, lecz jeśli w JFrame mam zadeklarowany JLabel z ikoną która służy mi za zdjęcie tła, to albo program nie widzi mojego JPanela lub jest schowany za obrazkiem tła (w zależności od miejsca implementacji).

public class MyFrame extends JFrame{

 DragPanel dragPanel = new DragPanel();
 private JLabel background;
 
 MyFrame(){
  
  this.add(dragPanel);
  
  this.setTitle("Drag");
  this.setSize(600, 600);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  ImageIcon image = new ImageIcon("C:\\Users\\Ja\\Documents\\creditcarddrag.png");
  background = new JLabel();
  background.setIcon(image);
  background.setBounds(0,0,1000,880);
  add(background);

  this.setVisible(true);
  
 }
}


public class DragPanel extends JPanel{
 
 ImageIcon image = new ImageIcon("C:\\Users\\Ja\\Documents\\creditcarddrag.png");
 ImageIcon img = new ImageIcon("C:\\Users\\Ja\\Documents\\creditcard.png");
 final int WIDTH = image.getIconWidth();
 final int HEIGHT = image.getIconHeight();
 Point imageCorner;
 Point prevPt;
 JLabel cos;
 
 DragPanel(){
  
  imageCorner = new Point(0,0);
  ClickListener clickListener = new ClickListener();
  DragListener dragListener = new DragListener();
  this.addMouseListener(clickListener);
  this.addMouseMotionListener(dragListener);
 }
 
 public void paintComponent(Graphics g) {
  super.paintComponent(g);
  image.paintIcon(this, g, (int)imageCorner.getX(), (int)imageCorner.getY());
 }
 
 private class ClickListener extends MouseAdapter{
  
  public void mousePressed(MouseEvent e) {
   prevPt = e.getPoint();
  }
 }
 
 private class DragListener extends MouseMotionAdapter {
        public void mouseDragged(MouseEvent e) {
            Point currentpt = e.getPoint();
            if (
                   (e.getPoint().getX() < ((int) imageCorner.getX() + WIDTH) &&
                    e.getPoint().getY() < (int) (imageCorner.getY() + HEIGHT))&&
                   (e.getPoint().getX() > (int) imageCorner.getX() &&
                    e.getPoint().getY() > (int) imageCorner.getY())) {
            imageCorner.translate(
                    (int) (currentpt.getX() - prevPt.getX()),
                    (int) (currentpt.getY() - prevPt.getY())
            );
                prevPt = currentpt;
            }
            repaint();
        }
    }
}
1
  1. Daj może pack() na koniec kontruktora tego JFrame, żeby się poustawiały rzeczy
  2. Wiesz co to są layouty w Swingu? To nie jest tak że robisz this.add(komponent) a Swing sie jakoś domyśli gdzie to sie ma pojawić i jak to ma wyglądać. Zapoznaj się z https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
  3. Dodajesz label na cały frame żeby mieć tło? o_O Nie nie nie, to nie będzie działać. Musisz zrobić klasę która dziedziczy z JPanela, nadpisać jej metodę paintComponent tak zeby malowała ci to tło, a potem ustawić content panel tego twojego JFrame ma obiekt tego specjalnego panela.

1 użytkowników online, w tym zalogowanych: 0, gości: 1