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ü
相关产品推荐
相关产品推荐

