Java 通过按按钮编写ActionListener以绘制形状
我需要编写一个GUI,每当我按下按钮Draw Circle/Draw Line时,它都会绘制圆/线 框架工作得很好,但是我无法实现这个程序的ActionListener。我不知道如何用“布尔圈”连接按钮。我试过的每件事都会给我带来错误 也许你能帮忙Java 通过按按钮编写ActionListener以绘制形状,java,Java,我需要编写一个GUI,每当我按下按钮Draw Circle/Draw Line时,它都会绘制圆/线 框架工作得很好,但是我无法实现这个程序的ActionListener。我不知道如何用“布尔圈”连接按钮。我试过的每件事都会给我带来错误 也许你能帮忙 public class fram extends JFrame { fram(){ JPanel panel = new JPanel(); add(panel); JButton btn1 = new J
public class fram extends JFrame {
fram(){
JPanel panel = new JPanel();
add(panel);
JButton btn1 = new JButton("Draw Circle");
JButton btn2 = new JButton("Draw Lines");
panel.add(btn1);
panel.add(btn2);
MyPanel obj = new MyPanel();
panel.add(obj);
}
public class MyPanel extends JPanel{
public boolean circZ = true;
public void paintComponent(Graphics g){**
super.paintComponent(g);
if(cicZ == true){
g.setColor(Color.BLACK);
g.drawOval(150, 50, 50, 50);
}else if(circZ==false){
...
}
}
}
public class CRListener implements ActionListener(){
!!! I DO NEED HELP HERE !!!
}
public static void main(String[]args){
fram f = new fram();
f.paint(null);
}
您需要做的是向每个JButton添加一个actionListener。将一个添加到bt1,一个添加到btn2。在每一个对话框中,您都会知道按下了哪一个,因为该对话框的actionListener将启动。在每个控件中,句柄生成一个圆或一条线。我的方法是创建一个CopyOnWriteArrayList来保存面板正在绘制的几何图形,否则您可能会遇到ConcurrentModification。另外,使用可选或原子引用来保存新生成的形状。在重新绘制中,您需要查看Optionals/AtomicReferences是否有新值。如果有,请将其添加到数组列表中,然后将其从原子引用中删除。在下面,循环遍历数组列表并绘制其中包含的所有图形对象。通过向按钮中添加匿名ActionListener,您可以完成正在尝试的操作(请参见下文)。您需要将MyPanel
设置为final
,或者将其设置为包含fram
的成员,以便以后可以引用
注意:在这种设计中,使MyPanel
成为fram
的内部类和circZ
成为fram
MyPanel obj;
fram(){
JPanel panel = new JPanel();
add(panel);
JButton btn1 = new JButton("Draw Circle");
JButton btn2 = new JButton("Draw Lines");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
obj.circZ =...;
}
});
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
obj.circZ =...;
}
});
panel.add(btn1);
panel.add(btn2);
obj = new MyPanel();
panel.add(obj);
}
您需要实现以下方法:
class CRListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello action listener"); // nothing happens
}
}
然后将其连接到按钮:
btn1.addActionListener(new CRListener ());
对每个按钮重复(并使其工作),然后您可以通过将参数传递给构造函数来优化它-我将让您了解这一部分:)
根据评论更新
要将上面的操作侦听器连接到面板,可以执行以下操作:
public class fram extends JFrame {
MyPanel myPanel;
fram(){
JPanel panel = new JPanel();
add(panel);
JButton btn1 = new JButton("Draw Circle");
JButton btn2 = new JButton("Draw Lines");
// add event listeners
btn1.addActionListener( new CRListener() );
btn2.addActionListener( new CRListener() );
panel.add(btn1);
panel.add(btn2);
myPanel = new MyPanel();
panel.add(myPanel);
}
必须将
ActionListener
添加到JFrame
。因此,我将在fram
类中执行事件处理,因为它扩展了JFrame
,并将其声明为:公共类fram extends JFrame implements ActionListener
。这有帮助吗?另外,您需要语句addActionListener(this)代码>在fram
类构造函数中。向下投票,正如在发布的代码中,无法引用ActionListener中的MyPanel向下投票,正如在发布的代码中,无法引用ActionListener中的MyPanel。我没有给出填鸭式回答。我提供了应该如何处理的基础。Jacob你至少应该提到范围问题,即使你不想“填鸭式”说实话,我也没有深入研究。我更关心的是如何处理未来的继续医学教育。