[英]Event Handling Between Two Classes
我一直在寻找几个小时,仍然没有找到我需要的东西,也没有任何教程/帮助指南/论坛指出我正确的方向。
我有两个单独的类,我需要实现一个动作监听器。 我能够从另一个班级去一个班级,但无法找到回到主班级的方法。 主类使用CardLayout
来显示第二个类。
是否有任何好的教程,或任何一个可以帮助/提出我的这个问题的建议? 谢谢
我最终得到了什么:
主类 -
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyGui extends JFrame {
//CardLayout
static CardLayout cardLayout;
static JPanel cards = new JPanel();
private void actionPerformed(ActionEvent evt) {
String cmd = evt.getActionCommand();
if(cmd.equals("HOME")) {
cardLayout.show(cards, "Main GUI");
}
}
//main Panel
JPanel mainP = new JPanel();
//north panel
TitleBar tb = new TitleBar();
JPanel top = new JPanel();
//JLabel title = new JLabel("Title Bar", JLabel.CENTER);
//center panel
JButton widgetBox = new JButton("<-- Touch Screen Widget Area -->");
//east panel
JPanel east = new JPanel();
JPanel picPanel = new JPanel(new GridLayout(1,1));
JButton pic = new JButton("Pic goes here");
JPanel settingsPanel = new JPanel(new GridLayout(1,2));
JButton appButton = new JButton("Apps");
JButton settingButton = new JButton("Settings");
//south panel
JPanel south = new JPanel();
JTextField rssFeed = new JTextField("RSS FEED");
//gui panels
MyGui2 widgPanel;
MyGui3 appPanel;
MyGui4 setPanel;
public MyGui() {
//main layout
super();
BorderLayout main = new BorderLayout();
mainP.setLayout(main);
//gui init
widgPanel = new MyGui2();
appPanel = new MyGui3();
setPanel = new MyGui4();
//CardLayout
final JFrame frame = new JFrame();
JPanel contentPane = (JPanel) frame.getContentPane();
cards.setLayout(cardLayout = new CardLayout());
cards.add("Main GUI", mainP);
cards.add("Settings GUI", setPanel);
cards.add("App GUI", appPanel);
cards.add("Widget GUI", widgPanel);
cardLayout.show(cards, "Main GUI");
contentPane.add(cards);
//north panel
BorderLayout header = new BorderLayout();
top.setLayout(header);
top.add(tb);
mainP.add(top, BorderLayout.NORTH);
//center panel
widgetBox.setEnabled(true);
widgetBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if(source == widgetBox) {
frame.setSize(325, 500);
cardLayout.show(cards, "Widget GUI");
}
}
});
mainP.add(widgetBox, BorderLayout.CENTER);
//east panel
BoxLayout eastPanel = new BoxLayout(east, BoxLayout.Y_AXIS);
east.setLayout(eastPanel);
picPanel.add(pic);
pic.setEnabled(false);
pic.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rssFeed.setText("Add Picture");
}
}
);
picPanel.setPreferredSize(new Dimension(175, 150));
//app button action
settingsPanel.add(appButton);
appButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//appPane
Object source = evt.getSource();
if(source == appButton) {
cardLayout.show(cards, "App GUI");
}
}
});
//settings button action
settingsPanel.add(settingButton);
settingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//setPane
Object source = evt.getSource();
if(source == settingButton) {
cardLayout.show(cards, "Settings GUI");
}
}
});
east.add(picPanel);
east.add(settingsPanel);
mainP.add(east, BorderLayout.EAST);
//south panel
BorderLayout footer = new BorderLayout();
south.setLayout(footer);
south.add(rssFeed);
rssFeed.setEditable(false);
rssFeed.setHorizontalAlignment(JTextField.CENTER);
mainP.add(south, BorderLayout.SOUTH);
//setLookAndFeel();
frame.setResizable(false);
frame.setSize(500, 325);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException exc) {
//ignore error
}
}
public static void main(String[] args) {
MyGui gui = new MyGui();
}
}
二等 -
bottom.setLayout(footer);
bottom.add(homeButton);
//home button action
homeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Go Back Home");
}
});
您可以在MyGui
中创建一个方法,将整个应用程序定向到Home
:
public static void showHome()
{
cardLayout.show(cards, "Main GUI");
}
而在SecondClass
使用此方法的actionPerformed
如下:
homeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
MyGui.showHome();
}
});
编辑
在上面的代码中,两个类之间仍然存在一些耦合。 还有另一种方法可以实现相同的任务并消除耦合问题:在MyGui
中创建SecondClass
对象时,在构造函数中将MyGui
当前对象的引用传递给它,如下所示:
public MyGui() {
...
widgPanel = new MyGui2(this);
....
}
创建非静态方法showHome
内MyGui
:
public void showHome()
{
cardLayout.show(cards, "Main GUI");
}
MyGui2
如下方式更改MyGui2
类:
class MyGui2{
MyGui mg;//create an instance variable of MyGui
MyGui2(MyGui mg)
{
this.mg = mg;
//Do all other stuffs here.
}
在actionPerformed
你可以按如下方式进行:
homeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
mg.showHome();
}
});
您应确保Second
具有对Main
实例的引用,以便他可以向其通知事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.