Java 在摇摆中传递事件?
我使用JavaSwing作为我的作业来做一个测验。下面是我的主框架类,它制作了新的面板,我将其作为单独的类。但是,例如,如果我有一个登录面板,并且用户点击了登录按钮,我如何向我的主TabbeQuit类发出有人登录的信号Java 在摇摆中传递事件?,java,swing,Java,Swing,我使用JavaSwing作为我的作业来做一个测验。下面是我的主框架类,它制作了新的面板,我将其作为单独的类。但是,例如,如果我有一个登录面板,并且用户点击了登录按钮,我如何向我的主TabbeQuit类发出有人登录的信号 public class TabbedQuiz { private JFrame jF; private JTabbedPane tP; public static void main(String[] args) { EventQueue.invokeLater(ne
public class TabbedQuiz {
private JFrame jF;
private JTabbedPane tP;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TabbedQuiz w = new TabbedQuiz();
w.jF.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TabbedQuiz() {
initialize();
}
private void initialize() {
tp= new JFrame();
tp.setTitle("welcome to ...");
final JPanel mainPanel= new JPanel();
final JPanel anotherPanel= new JPanel();
final JPanel examplePanel = new JPanel();
final JPanel quizPanel = new JPanel();
final JPanel examPanel = new JPanel();
final JPanel viewPerfPanel = new JPanel();
final JPanel settingsPanel = new JPanel();
//设置面板
tF.setBounds(100, 100, 764, 470);
tF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tF.getContentPane().setLayout(null);
tabbedPane = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.setBounds(10, 11, 728, 410);
tF.getContentPane().add(tabbedPane);
tabbedPane.addTab("Welcome", null, mainPanel, null);
//设置其他选项卡如果您的目标是在有人登录之前阻止访问测验,则在用户登录之前隐藏其他面板或框架 下面是一个使用CardLayout的示例:
final JPanel mainPanel = new JPanel(new CardLayout());
final JTextField textField = new JTextField(10);
Action action = new AbstractAction("Login") {
public void actionPerformed(ActionEvent e) {
/* Check user credentials here. */
boolean b = textField.getText().equals("true");
CardLayout cl = (CardLayout)(mainPanel.getLayout());
cl.show(mainPanel, b ? e.getActionCommand() : "login");
}
};
JButton loginButton = new JButton(action);
loginButton.setActionCommand("quiz");
JPanel loginPanel = new JPanel();
loginPanel.add(textField);
loginPanel.add(loginButton);
JPanel quizPanel = new JPanel();
quizPanel.add(new JLabel("Quiz"));
mainPanel.add(loginPanel, "login");
mainPanel.add(quizPanel, "quiz");
JFrame f = new JFrame();
f.setContentPane(mainPanel);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
我相信你需要一个行动听众 请参见此处的文档: 例如:
login_button = new Button('Login')
login_button.addActionListener(loginNotifyListener)
loginNotifyListener将具有对测验的引用,并可以在其actionPerformed方法中调用某些函数
编辑:您可能希望在tabbedquick的初始化方法中创建侦听器,并将其传递到登录面板。例如:
private void initialize() {
...
loginActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
TabbedQuiz.this.notifyLogin()
}
}
final JPanel loginPanel = new JPanel();
...
login_button = new Button('Login')
login_button.addActionListener(loginNotifyListener)
loginPanel.add(login_button)
...
}
希望这是有意义的。这里有一些头脑风暴的想法 创建一个名为QuizPanel的类,它扩展了JPanel。在该类中,有一个方法可以更改面板的内容。您的登录面板(通过侦听器)可以调用此类 这里有一个例子
public class QuizPanel extends JPanel{
private boolean loggedIn = false;
public QuizPanel() {}
public void setLoggedIn(boolean x){
loggedIn=x;
if(loggedIn){
//Show the questions
}else{
//Don't show questions
}
}
public boolean getLoggedIn() {return loggedIn; }
}
另一种选择是使用,这样你就可以隐藏问题,并且只在用户登录后才显示问题。你应该在
提示:当组件生成事件时,将通知所有注册的侦听器 使用侦听器是处理此类上下文的标准Swing方式,前面的答案应该可以帮助您。。。您可以尝试找到一种更复杂但更智能的方法来处理异步通知,同时将JMS方法与一个标准代理(activemq或任何其他代理)一起使用。。。这种方法可能会给您带来很好的代码隔离,但会提高复杂性 嗯
jerome不是一个理想的方法,只需在其他类中创建一个静态方法,一旦登录成功,就可以调用该方法。在该方法中,简单地将布尔volatile变量从false设置为true,在同一个类中,您应该有一个带有while(此标志)的线程,它将变为true,您可以执行任何操作,如显示新GUI等。是的,这正是我正在编写的,但我计划了一个示例。但是@user1044585你可以看看@SHiRKiT,我有点模糊地看了MVC,但我发现有点复杂。你能举一个例子说明我是如何使用标签框架和各种JPanel的吗?例如,我刚刚指出,你找不到你想要的例子。您需要查看GXT视图类以了解其工作原理。但是你可以在这里看一下:有一些例子是我在GWT中使用这些类,而不是离线应用程序。。。但我在我的主课上尝试了以下方法。在我的登录面板中,我添加了另一个侦听器以从文本字段等获取数据,但它不起作用….:(
tabbedquick.addWindowListener(new WindowAdapter(){public void windowActivated(WindowEvent arg0){JButton loginButton=new JButton(action);LoginPanel LoginPanel=new LoginPanel(loginButton);welcomePanel.add(LoginPanel);welcomePanel.setBounds(0,0728390);}})
如果添加“login”按钮,它可以简单地读取按钮操作中的文本字段。您实际上不需要侦听器。好了,现在我将下面的内容添加到窗口侦听器中。我是否还需要初始化登录面板中的文本字段和登录按钮?单击“登录时不工作”loginButton=new JButton(操作);LoginPanel LoginPanel=new LoginPanel();textPassword=new JTextField();textPassword.setBounds(324170250,31);textUsername=new JTextField();textUsername.setBounds(324127250,31);textUsername.setColumns(10);LoginPanel.add(loginButton);LoginPanel.add(textPassword);LoginPanel.add(textUsername);welcomePanel.add(LoginPanel);
您不应该使用WindowListener来显示登录面板。此代码应该在框架的构造函数中。一旦将框架设置为可见,您应该会看到文本字段和按钮。WindowListener也在构造函数中。我看到了所有组件,但单击时不会触发操作