3

I am making a chat app and have a login page, but I want it to be that when you click login it opens the next page, but not in a new window. Should I be adding my objects from the frame (frame.add) or the panel(panel.add)? Here's my code.

import javax.swing.*;
import javax.swing.border.Border;

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ChatWindowLogin extends JFrame implements WindowStateListener, ActionListener{
    public Dimension ss;
    public JButton login;
    public JButton signup;
    public JFrame frame;

    public ChatWindowLogin() {
        frame = new JFrame("EasyChat Alpha v0.1");
        frame.addWindowStateListener(this);
        login = new JButton("Login");
        signup = new JButton("Sign Up");
        
        JPanel mainPanel = new JPanel();
        JPanel loginPanel = new JPanel();
        Color lightblue = new Color(78, 159, 206);
        Color darkblue = new Color(24, 40, 85);
        Border emptyBorder = BorderFactory.createEmptyBorder();
        ss = Toolkit.getDefaultToolkit().getScreenSize();

        frame.setVisible(true);
        frame.setLayout(null);
        
        frame.setSize(800,450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.getContentPane().setBackground(darkblue);
        
        frame.getContentPane().add(login);
        frame.getContentPane().add(signup);
        frame.getContentPane().add(mainPanel);
        
        login.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
        login.setBounds(ss.width / 2 - 200 / 2, ss.height / 2 - 100 / 2, 200, 65); 
        login.setBackground(lightblue);
        login.setFocusPainted(false);
        login.setBorder(emptyBorder);
        
        signup.setFont(new Font("HelveticaNeue", Font.BOLD, 20));
        signup.setBounds(ss.width / 2 - 200 / 2, ss.height / 2 + 90 - 100, 200, 65);
        signup.setBackground(lightblue);    
        signup.setFocusPainted(false);
        signup.setBorder(emptyBorder);
        
        frame.add(loginPanel);
        
        
        //mainPanel.setLayout(new BorderLayout());
        //mainPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
    }

    
    @Override
    public void windowStateChanged(WindowEvent e) {
        Dimension ss = frame.getSize();
        signup.setBounds(ss.width / 2 - 200 / 2, ss.height / 2 + 90 - 100, 200, 65);
        login.setBounds(ss.width / 2 - 200 / 2, ss.height / 2 - 100, 200, 65); 
    
        
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==login) {
            ChatWindowMain chatWindow = new ChatWindowMain();
        }
    
}
}

Here's the next class for the main chat window(not finished yet):

import javax.swing.border.Border;

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;

public class ChatWindowMain extends ChatWindowLogin{
    Dimension ss;
    JButton send;
    JTextField enter;
    JFrame frame;
    JPanel chatPanel = new JPanel();
    
    public ChatWindowMain() {
        send = new JButton();
        chatPanel.setLayout(new BorderLayout());
        chatPanel.add(send);
        
        
        chatPanel.add(send);
        frame.add(chatPanel);
        this.add(chatPanel);
        
    }
}

Also when using a layout such as border layout, can you still put the objects anywhere you want and have them at any size you want? And for the login class, do I need a main method there, because eclipse says I do.

JE Krupat
  • 91
  • 6
  • 3
    *"but not in a new window"* Design each view in a `JPanel` and use a `CardLayout` to switch between them. *"Also when using a layout such as border layout, can you still put the objects anywhere you want and have them at any size you want?"* No, but in a way, yes. Use layouts to define a logical layout (e.g. 'column of buttons, centered in the view') and it will display the components in a logical position which flows as the window is resized. No need for `windowStateChanged..`. – Andrew Thompson Dec 18 '21 at 16:05
  • 1
    You want something like [this](https://stackoverflow.com/questions/46011991/how-to-show-different-pages-from-the-center-element-of-jframe-having-set-to-bor/46013230#46013230) – c0der Dec 18 '21 at 17:20

0 Answers0