Java 钮扣和油漆方法

Java 钮扣和油漆方法,java,swing,graphics,jbutton,actionlistener,Java,Swing,Graphics,Jbutton,Actionlistener,我的钮扣有问题。我知道它们在工作,因为我已经通过System.exit退出了问题来测试它们。以下是我的输出: 当我单击关闭按钮时,开关上的手柄应重新绘制到另一侧,关闭按钮应更改为打开。当我单击“打开”按钮时,它应该会执行相反的操作。但是,这些按钮没有任何作用。我做错了什么 public class ProgrammingAssignment2 { public static void main(String[] args) { boolean ison = false;

我的钮扣有问题。我知道它们在工作,因为我已经通过System.exit退出了问题来测试它们。以下是我的输出:

当我单击关闭按钮时,开关上的手柄应重新绘制到另一侧,关闭按钮应更改为打开。当我单击“打开”按钮时,它应该会执行相反的操作。但是,这些按钮没有任何作用。我做错了什么

public class ProgrammingAssignment2 {

public static void main(String[] args) {

    boolean ison = false;

    // Objects
    Circuit circuitObject = new Circuit();
    Controller controllerObject = new Controller();
    Draw drawObject = new Draw();
    AllListeners listenerObject = new AllListeners();
    drawObject.window();

    circuitObject.buttons(drawObject, ison);
    controllerObject.openFile("Programming Assignment 2 Data.txt", drawObject);
}
}
类回路只是创建按钮

import javax.swing.JButton;

public class Circuit {

public void buttons(Draw drawObject, boolean ison) {
    AllListeners listenerObject = new AllListeners();

    if (ison == true) {

        JButton openButton = new JButton("Close");
        openButton.addActionListener(listenerObject);
        openButton.setBounds(200, 100, 50, 20);
        drawObject.add(openButton);
    } else if (ison == false) {

        JButton closeButton = new JButton("Open");
        closeButton.addActionListener(listenerObject);
        closeButton.setBounds(50, 100, 50, 20);
        drawObject.add(closeButton);
    }
}
}
绘画课做了大部分的工作。它创建所有图形并读取文本文件,其中包含每个对象(如开关和灯泡)的标题

这是actionlisterner类

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class AllListeners implements ActionListener {

public void actionPerformed(ActionEvent e) {
    Circuit circuitObject = new Circuit();
    Draw drawObject = new Draw();
    String buttonString = e.getActionCommand();

    if (buttonString.equals("Close")) {
        drawObject.setisOn();
        drawObject.repaint();

    } else if (buttonString.equals("Open")) {
        drawObject.setisOff();
        drawObject.repaint();

    } else {
        System.out.println("Unexpected error.");
    }
}
}

这段代码有很多主要问题,包括:

  • 直接在JFrame的绘制方法中绘制,这是一件充满问题的事情,因为您可能会弄乱JFrame自己复杂的绘制
  • 将程序逻辑放在绘画方法中,一种你不能完全控制何时或是否触发的方法,一种你不应该减慢速度的方法
  • 在绘制方法中放置零部件创建代码
  • 试图随意添加多个JButton,而不是更改现有组件的状态
  • 创建多个回路对象
  • 尝试通过
    setBounds(…)
    使用绝对定位将组件放置在使用BorderLayout的容器中
我建议你

  • 重新开始并废弃此代码
  • 只使用JPanel的paintComponent方法进行绘制,就像教程告诉您的那样
  • 只创建一次按钮并将其添加到GUI中
  • 从painting(这里是paintComponent)方法中获取所有程序逻辑,以及在该方法之外更改的所有对象状态,因为它们仅用于绘制和绘制
  • 相反,逻辑应该属于控制器,并且应该在按钮按下时通知控制器
  • 请考虑按钮的按下,通知被按下的控件,
  • 控件更改程序的状态(更改变量)
  • 然后调用repaint,以便paintComponent方法可以使用这些变量来更改其图形
  • 此外,尽可能避免使用收进框和空布局,而是使用布局管理器/边框/嵌套JPanel来帮助您放置组件
public class Controller {

public void openFile(String filename, Draw drawObject) {
    drawObject.readFile(filename);
}
}
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class AllListeners implements ActionListener {

public void actionPerformed(ActionEvent e) {
    Circuit circuitObject = new Circuit();
    Draw drawObject = new Draw();
    String buttonString = e.getActionCommand();

    if (buttonString.equals("Close")) {
        drawObject.setisOn();
        drawObject.repaint();

    } else if (buttonString.equals("Open")) {
        drawObject.setisOff();
        drawObject.repaint();

    } else {
        System.out.println("Unexpected error.");
    }
}
}