我一直在寻找时间,但仍然找不到我需要的东西,也没有任何教程/帮助指南/论坛来向我指出正确的方向。
我有两个单独的类,我需要实现一个动作监听器。我可以从另一堂课上一堂课,但无法找到一种回到主堂课的方法。主类使用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
类: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();
}
});