MouseListener работает для первого JPanel, но не для последующих JPanel, даже когда добавляется таким же образом? - PullRequest
0 голосов
/ 13 июня 2019

В игре, которую я делаю, есть два типа JPanels: один кликабельный, а другой нет.При нажатии на активируемую JPanel экран очищается, и создаются новые JPanel, поэтому новый MouseListener добавляется в любой из новых активируемых JPanel

Однако, по некоторым причинам, только первые кликабельные JPanel регистрируются при нажатии,Отладка показывает, что все последующие кликабельные JPanels никогда не регистрируют нажатие или отпускание мыши, ввод или выход для jpanel.Возможно ли проблема из-за того, что JPanels находятся в большем JPanel?

Я пытался добавить MouseListeners в любой JPanel, и он все еще работает только после первого щелчка

Это из конструктораодного из JPanels:

public GraphicsBaseFrame( int x, int y, int width, int height, String text, int index, boolean clickable ) {
      this.index = index;

      ip = new ImagePanel( this ); // this is needed from the commented section above
      ip.setLayout( null );
      add( ip );

      Insets insets = getInsets();
      Dimension size = new Dimension( width, height );
      ip.setBounds( 0, 0, size.width, size.height );
      ip.setBorder( BorderFactory.createLineBorder( Color.YELLOW ) );
      repaint();

      fileName = getTextImage( text, "Arial", Font.PLAIN, 32, "screenCurrent" );

      BufferedImage img = null;
      try {
         img = ImageIO.read( new File( fileName ) );
      } catch( IOException e ) {
         System.out.println( "Error: " + e );
      }
      //SOPln( "img width: " + img.getWidth() + "height: " + img.getHeight() );
      imageWidth = img.getWidth();
      imageHeight = img.getHeight();

      Insets insets2 = getInsets();
      Dimension size2 = new Dimension( imageWidth, imageHeight );
      setBounds( x + insets2.left, y + insets2.top, size2.width, size2.height );

      setLayout( null );
      setOpaque( true );
      setBackground( Color.BLACK );
      setBorder( BorderFactory.createLineBorder( Color.YELLOW ) );

      ip.setBackground( Color.BLACK );
      repaint();

      drawImage( fileName );                            //draws image to panel
      //drawNewImage( fileName );                       //functions draw on top of image instead of changing pixels
      //filterNewImage( fileName, secondFileName );     //functions change pixels of actual image

      if( clickable ) {

         ip.addMouseListener( new MouseAdapter() {

            private Color background;

            @Override
            public void mousePressed( MouseEvent e ) {

               //@@DEBUG
               if( text.equals("<continue>") )
                  SOPln("worked");

               Object event = e.getSource();
               JPanel panel = (JPanel)event;
               panel.setBackground( Color.YELLOW );
               background = getBackground();
               setBackground( Color.YELLOW );
               ip.setBackground( Color.YELLOW );
               repaint();
            }

            @Override
            public void mouseReleased( MouseEvent e ) {
               setBackground( background );
               State.changeScreens = true;
               State.optionNumber = index;
            }

            @Override
            public void mouseEntered( MouseEvent e ) {
               background = getBackground();
               setBackground( Color.YELLOW );
               ip.setBackground( Color.YELLOW );
               repaint();
            }

            @Override
            public void mouseExited( MouseEvent e ) {
               setBackground( background );
               ip.setBackground( background );
               repaint();
            }

            @Override
            public void mouseClicked( MouseEvent e ) { }

         });
      }
}

Не удалось получить сообщение об ошибке при попытке заставить вещи работать.Программа работает как надо, но из-за того, что MouseListener не работает, вы не можете пройти дальше этого уровня (это сюжетная игра типа text-rpg)

...