Java 钮扣和油漆方法
我的钮扣有问题。我知道它们在工作,因为我已经通过System.exit退出了问题来测试它们。以下是我的输出: 当我单击关闭按钮时,开关上的手柄应重新绘制到另一侧,关闭按钮应更改为打开。当我单击“打开”按钮时,它应该会执行相反的操作。但是,这些按钮没有任何作用。我做错了什么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;
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,而不是更改现有组件的状态
- 创建多个回路对象
- 尝试通过
使用绝对定位将组件放置在使用BorderLayout的容器中setBounds(…)
- 重新开始并废弃此代码
- 只使用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.");
}
}
}