Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在摇摆中传递事件?_Java_Swing - Fatal编程技术网

Java 在摇摆中传递事件?

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

我使用JavaSwing作为我的作业来做一个测验。下面是我的主框架类,它制作了新的面板,我将其作为单独的类。但是,例如,如果我有一个登录面板,并且用户点击了登录按钮,我如何向我的主TabbeQuit类发出有人登录的信号

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也在构造函数中。我看到了所有组件,但单击时不会触发操作