当我按任意键时,为什么此代码没有按预期交换图像?

问题描述 投票:0回答:1

我的程序最初旨在显示 2 个面板,其中包含文件 Z_pic1.png 和 Z_pic2.png 中的不同图像。按下任何键时,面板上的显示应交换交换。它不显示 2 个图像,而仅显示 Z_pic2,png 中的图像。任何按键都没有效果。想找出问题所在。

我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Z_LayeredPaneExample1_2 extends JFrame {
private JPanel[] panels;
private JLabel[] imageLabels;

public Z_LayeredPaneExample1_2() {
    setTitle("Panel Swapper");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(800, 600);
    setLocationRelativeTo(null);

    // Create the panel array
    panels = new JPanel[2];
    imageLabels = new JLabel[2];

    // Load the images
    ImageIcon image1 = new ImageIcon("Z_pic1.png");
    ImageIcon image2 = new ImageIcon("Z_pic2.png");

    // Create the panels and add them to the frame
    createPanels(image1, image2);

    // Add a key listener to swap the images when a key is pressed
    addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            swapPanels();
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    });

    setVisible(true);
}

private void createPanels(ImageIcon image1, ImageIcon image2) {
    // Create the panels and set their layout and background color
    for (int i = 0; i < panels.length; i++) {
        panels[i] = new JPanel();
        panels[i].setLayout(new BorderLayout());
        panels[i].setBackground(Color.WHITE);

        // Add the image to the panel
        imageLabels[i] = new JLabel(i == 0 ? image1 : image2);
        panels[i].add(imageLabels[i], BorderLayout.CENTER);

        // Add the panel to the frame
        add(panels[i], BorderLayout.WEST);
    }
}

private void swapPanels() {
    // Swap the images in the panels
    ImageIcon temp = (ImageIcon) imageLabels[0].getIcon();
    imageLabels[0].setIcon(imageLabels[1].getIcon());
    imageLabels[1].setIcon(temp);
}

public static void main(String[] args) {
    new Z_LayeredPaneExample1_2();
}
}
java swing
1个回答
0
投票

问题是您在

panels[0]
实例中的同一位置
panels[1]
 添加了面板 
BorderLayout.WEST
JFrame
。当
BorderLayout
中的一个位置被填充时,当为该确切位置设置新值时,它会被覆盖。这就是为什么您只能看到一个面板,因此只能看到一张图像。

您可以使用类似的技巧,例如

add(panels[i], i == 0 ? BorderLayout.WEST : BorderLayout.EAST);

将第一个面板添加到

WEST
区域,将第二个面板添加到
EAST
区域。之后,当您按下某个键时,您将看到图像交换位置。

© www.soinside.com 2019 - 2024. All rights reserved.