我创建了一个jframe
用于登录,我想在按钮“cont nou”被按下后用jpanel为新帐户打开一个新窗口,但不知道如何用jpanel将初始帧消失和出现。你有什么想法吗?谢谢你!这就是我到现在所做的:
这是jframe
,其登录名为:
public class LogIn extends JFrame implements ActionListener{
private JLabel labelEmail;
private JLabel labelParola;
private JTextField textFieldEmail;
private JPasswordField textFieldParola;
private JButton buttonLogin;
private JButton buttonContNou;
public LogIn (){
super();
this.setSize(400,200);
this.setTitle("Login");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.setResizable(false);
this.setupComponents();
}
private void setupComponents(){
labelEmail = new JLabel("Email: ");
labelParola = new JLabel("Parola: ");
textFieldEmail = new JTextField();
textFieldParola = new JPasswordField();
buttonContNou = new JButton("Cont Nou");
buttonLogin = new JButton("Login");
labelEmail.setBounds(30,30,50,20);
labelParola.setBounds(30,70,50,20);
textFieldEmail.setBounds(100,30,185,20);
textFieldParola.setBounds(100,70,185,20);
buttonContNou.setBounds(185,110,100,20);
buttonLogin.setBounds(100,110,75,20);
buttonLogin.addActionListener(this);
buttonContNou.addActionListener(this);
this.add(labelEmail);
this.add(labelParola);
this.add(textFieldEmail);
this.add(textFieldParola);
this.add(buttonLogin);
this.add(buttonContNou);
}
public static void main(String[] args){
LogIn login= new LogIn();
login.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(buttonLogin)){
boolean toateDateleOk =true;
textFieldEmail.setBackground(Color.WHITE);
textFieldParola.setBackground(Color.WHITE);
if(textFieldEmail.getText().length()==0){
textFieldEmail.setBackground(Color.RED);
toateDateleOk =false;
}
if(textFieldParola.getPassword().length==0){
textFieldParola.setBackground(Color.RED);
toateDateleOk =false;
}
if(!toateDateleOk)
return ;
else
System.out.println("Incepe Procesul de logare");
if(e.getSource().equals(buttonContNou)){
//this.dispose();
//dispose();
//new NewAccountPanel().setVisible(true);
//new secondTab().show();
}
}
}
}
首先,您应该尽可能避免直接从顶级容器(如jframe
)进行扩展。这将您绑定到一个单一的use组件,例如,您不能在另一个窗口(作为大型组件层次结构的一部分)或applet上下文中重用登录控件。您也没有向类本身添加任何新功能。
你也应该限制你推到你的用户上的窗口的数量,因为它会很快变得混乱。看看多个JFrames的使用,好/坏的实践?了解更多详情。
相反,您应该考虑使用MVC(Model-View-Controller)设计,以减少类之间的耦合量,并使组件暴露于不需要的/不希望的修改中。
让我们从定义契约开始,这定义流程中的每个元素预期要做什么以及传递的信息
这定义了应用程序中每个视图的核心功能。每个视图都可以有一个控制器(由C
定义),并且预期提供一个JComponent
作为基表示,该基表示用于将视图物理地添加到容器
public interface View<C> {
public JComponent getView();
public void setController(C controller);
public C getController();
}
这定义了登录视图应该提供什么信息,在本例中,我们提供了用户名和密码信息,以及控制器可以告诉视图登录尝试失败的方法。这允许视图重置视图并在需要时显示错误消息
public interface LoginView extends View<LoginController> {
public String getUserName();
public char[] getPassword();
public void loginFailed(String errorMessage);
}
这定义了login视图的控制器预期会发生的操作,视图调用这些操作来告诉控制器它应该做些什么...
public interface LoginController {
public void performLogin(LoginView view);
public void loginCanceled(LoginView view);
}
我没有提供这方面的示例,但您可以想象,您需要提供您想要提供的细节,以便感兴趣的各方从视图中提取细节。
这是基本的loginview
实现...
public class LoginPane extends JPanel implements LoginView {
private JTextField userName;
private JPasswordField password;
private JButton okButton;
private JButton cancelButton;
private LoginController controller;
public LoginPane() {
setLayout(new GridBagLayout());
userName = new JTextField(10);
password = new JPasswordField(10);
okButton = new JButton("Ok");
cancelButton = new JButton("Cancel");
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("User name: "), gbc);
gbc.gridy++;
add(new JLabel("Password: "), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 2;
add(userName, gbc);
gbc.gridy++;
add(password, gbc);
gbc.gridwidth = 1;
gbc.gridy++;
add(okButton, gbc);
gbc.gridx++;
add(cancelButton, gbc);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getController().performLogin(LoginPane.this);
}
});
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getController().loginCanceled(LoginPane.this);
}
});
}
@Override
public String getUserName() {
return userName.getText();
}
@Override
public char[] getPassword() {
return password.getPassword();
}
@Override
public void loginFailed(String errorMessage) {
JOptionPane.showMessageDialog(this, errorMessage, "Login failed", JOptionPane.ERROR_MESSAGE);
}
@Override
public void setController(LoginController controller) {
this.controller = controller;
}
@Override
public JComponent getView() {
return this;
}
@Override
public LoginController getController() {
return controller;
}
}
基本应用程序视图
public class ApplicationPane extends JPanel implements View {
public ApplicationPane() {
setLayout(new GridBagLayout());
add(new JLabel("Welcome to my awesome application"));
}
@Override
public JComponent getView() {
return this;
}
@Override
public void setController(Object controller) {
// What ever controller you want to use...
}
@Override
public Object getController() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
我们会,这是很多信息,但你怎么用它?
public class CoreApplicationCPane extends JPanel {
protected static final String LOGIN_VIEW = "View.login";
protected static final String APPLICATION_VIEW = "View.application";
private LoginView loginView;
private ApplicationPane applicationView;
private CardLayout cardLayout;
public CoreApplicationCPane() {
cardLayout = new CardLayout();
setLayout(cardLayout);
loginView = new LoginPane();
applicationView = new ApplicationPane();
add(loginView.getView(), LOGIN_VIEW);
add(applicationView.getView(), APPLICATION_VIEW);
loginView.setController(new LoginController() {
@Override
public void performLogin(LoginView view) {
// Do what ever you need to do...
String name = view.getUserName();
char[] password = view.getPassword();
//...
cardLayout.show(CoreApplicationCPane.this, APPLICATION_VIEW);
}
@Override
public void loginCanceled(LoginView view) {
SwingUtilities.windowForComponent(CoreApplicationCPane.this).dispose();
}
});
cardLayout.show(this, LOGIN_VIEW);
}
}
这基本上是所有东西都插在一起的地方。将LoginView
和ApplicationView
实例化并添加到主视图中,然后插入控制器。
了解更多详情。
对于更详细的示例,看一下Java和GUI-根据MVC模式,ActionListeners属于哪里?
我目前正在开发一个聊天程序的登录表单,希望该程序加载框架并等待用户输入。不可饶恕的是,程序打开了框架,但同时又恢复了主方法。我希望你有一些想法来帮助我。 问候语 JFrame类:
我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检
可以使用另一个jFrame的按钮来处理jFrame吗?如果可能的话,这些代码在netbeans中应该是什么样子?
问题内容: 我有一JFrame堂课,它是在Netbeans的设计部分制作的。我正在尝试创建一个登录按钮,该按钮将关闭当前框架并打开另一个框架,无论如何我可以这样做吗? 我努力了: 但我希望它在设计部分中可编辑! 问题答案: 双击NETBEANS中的“登录”按钮,或在Click事件上添加事件监听器(ActionListener)
我必须确保当按下开始游戏按钮时会打开游戏框架。 这是菜单: 这是控制器类: 问题是,当我按下时,我有这个异常: 线程中的异常"AWT-EventQuue-0"java.lang.ClassCast异常:javax.swing.JButton不能转换为javax.swing.JRadioButton
嗨,我有问题打开新窗口fxml视图后单击按钮。主窗口显示,在主视图中我有六个按钮。我想我点击按钮打开新窗口。但是,当我单击按钮时,显示异常: java.lang.Reflect.InvocationTargetException 我尝试在internet上找到的不同解决方案,但显示此异常。主要是尝试在切换函数中修改代码,负责显示新视图。我认为问题出在这里或者是在主类中的代码。