每次按下Draw Circle / Draw Line按钮时,我都需要编写一个绘制圆/线的GUI。
框架工作得很好,但是我在为这个程序实现ActionListener时遇到了麻烦。我不知道如何用“boolean circZ”连接按钮。我尝试的一切都给了我错误。
也许你可以提供帮助。
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);
}
答案 0 :(得分:2)
您可以通过向按钮添加匿名ActionListeners来完成您要执行的操作(请参阅下文)。您需要创建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);
}
答案 1 :(得分:0)
您需要做的是为每个JButton添加一个actionListener。将一个添加到bt1,将一个添加到btn2。在每一个中,你都会知道哪一个被按下了,因为那个的actionListener会被触发。在每个中,句柄生成一个圆或一行。我这样做的方法是创建一个CopyOnWriteArrayList来保存面板正在绘制的几何图形 - 否则你可能会遇到ConcurrentModification。此外,使用Optional或AtomicRefence来保存新生成的形状。在重绘中,您需要查看Optionals / AtomicReferences中的任何一个是否具有新值。如果是,请将其添加到数组列表中,然后将其从原子引用中删除。在它下面,循环遍历数组列表并绘制它包含的所有图形对象。
答案 2 :(得分:0)
您需要实施该方法:
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);
}