В игре, которую я делаю, есть два типа 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)