You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现XNOR逻辑门可视化程序遇bug,请求协助排查

解决XNOR逻辑门可视化程序的问题

问题根源

你给每个复选框绑定了两个ActionListener,触发时会先后执行updateOutputState1和updateOutputState,两个方法的逻辑冲突,导致最终显示被错误的逻辑覆盖。另外每次更新都重新创建Box组件的方式也不够高效。

修正后的代码

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;

class XNOR extends JPanel {
    JFrame frame = new JFrame("XNOR Gate");
    JCheckBox input1 = new JCheckBox("Input 1");
    JCheckBox input2 = new JCheckBox("Input 2");
    Box outputPanel = new Box(Color.PINK);

    public XNOR() {
        // 每个复选框只绑定一个监听器,调用统一的更新方法
        input1.addActionListener(actionEvent -> updateOutputState());
        input2.addActionListener(actionEvent -> updateOutputState());

        createFrame();
    }

    private void createFrame() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JPanel inputPanel = new JPanel();
        inputPanel.add(input1);
        inputPanel.add(input2);
        frame.add(inputPanel);
        frame.add(outputPanel);

        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    private void updateOutputState() {
        // XNOR逻辑:两个输入状态相同时显示绿色,否则红色
        boolean isSameState = input1.isSelected() == input2.isSelected();
        outputPanel.setColor(isSameState ? Color.GREEN : Color.RED);
        frame.repaint();
    }
}

class Box extends JPanel {
    private Color color;

    public Box(Color color) {
        this.color = color;
    }

    // 添加修改颜色的方法,无需重新创建组件
    public void setColor(Color color) {
        this.color = color;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(color);
        Rectangle2D rect = new Rectangle2D.Double(20, 20, 160, 160); // 调整尺寸避免超出面板
        g2.draw(rect);
        g2.fill(rect);
    }
}

class RunXNOR {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(XNOR::new); // 确保在Swing事件线程启动程序
    }
}

关键修改点

  • 移除重复监听器:每个复选框只保留一个ActionListener,彻底避免逻辑冲突
  • 实现正确XNOR逻辑:直接判断两个输入的选中状态是否相同,相同则显示绿色,不同则显示红色
  • 优化组件更新:给Box类添加setColor方法,直接修改颜色并重绘,无需反复移除和添加组件
  • 规范线程操作:用SwingUtilities.invokeLater启动程序,符合Swing的线程安全要求

内容的提问来源于stack exchange,提问作者MehmetCan Külcü

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:27