gpt4 book ai didi

Java Swing : how do I use an unnamed button in another class?

转载 作者:行者123 更新时间:2023-12-02 09:14:07 25 4
gpt4 key购买 nike

我目前正在尝试向某些按钮添加功能作为作业的一部分。作业的起始代码使用未命名的按钮,当尝试为这些按钮命名时会导致错误。

通常这不会太难,因为我了解如何使用未命名的按钮(前提是它位于同一个类中)。

然而这是棘手的部分 - 我不允许使用相同的类来添加功能。我正在努力弄清楚,当按钮未命名且位于不同的类中时,尝试向按钮添加功能。它分为两个单独的类 - 设计本身的 View (这包括按钮)和 Controller (这是我想要的按钮处理)

这是 View 类的代码:

package clock;

import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.util.Observer;
import java.util.Observable;

public class View implements Observer {

ClockPanel panel;
ActionListener listener;

public View(Model model) {
JFrame frame = new JFrame();
panel = new ClockPanel(model);
//frame.setContentPane(panel);
frame.setTitle("Java Clock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Start of border layout code

Container pane = frame.getContentPane();

JButton button = new JButton("Button 1");
pane.add(button, BorderLayout.PAGE_START);

panel.setPreferredSize(new Dimension(200, 200));
pane.add(panel, BorderLayout.CENTER);

//This is the button I want to use
button = new JButton("Create Alarm");
pane.add(button, BorderLayout.LINE_START);


button = new JButton("View Alarms");
pane.add(button, BorderLayout.PAGE_END);

button = new JButton("5 (LINE_END)");
pane.add(button, BorderLayout.LINE_END);

// End of borderlayout code

frame.pack();
frame.setVisible(true);
}

public void update(Observable o, Object arg) {
panel.repaint();
}
}

这是 Controller 类的代码:

package clock;

import java.awt.event.*;
import javax.swing.Timer;

public class Controller {

ActionListener listener;
Timer timer;

AddAlarm AddAlarm;
Model model;
View view;

public Controller(Model m, View v, AddAlarm a) {
model = m;
view = v;
AddAlarm = a;

listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.update();

}
// and this is what I want the button to do.
// button.addActionListener(listener);
// private void ButtonActionPerformed(java.awt.event.ActionEvent evt) {
// new AddAlarm().setVisible(true);
// }
};


timer = new Timer(100, listener);
timer.start();
}
}

我自己对 Swing 还很陌生,所以如果有人能告诉我如何实现这一点,我将不胜感激。

最佳答案

将 Continer Pane 的引用传递给 Controller ​​或 View 中的 getter 方法以返回 Pane -> 迭代所有组件并获取所有按钮 -> 将它们向下转换回 Jbuttons 并附加事件监听器 -> 某些内容像这样...

//get a container reference from view
Container pane = view.getPane();

Component[] components = pane.getComponents();
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//do something with the button click;
String txt = ((Button)e.getSource()).getText();
if(txt.equals("bla"){
//do bla
}
}
};

for (Component component : components) {
if (component instanceof JButton) {
((JButton) component).addActionListener(actionListener);
}
}

关于Java Swing : how do I use an unnamed button in another class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59142122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com