Search code examples
javajdbcjbuttonjscrollpanewindowbuilder

New button creation inside JScrollPane


I've written a so called 'error less' code but I'm facing certain problems whilst using the application. This used to work perfectly before but as soon as I took the code over to the windowbuilder as a Jframe it started to not work. Here's my code:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.RootPaneContainer;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

import java.awt.Font;

import javax.swing.JMenuBar;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;


public class AdminClass implements ActionListener  {

ProjectButton[] buttons = new ProjectButton[35];

//Creating data field for unique Ids in the form of array list
ArrayList<Integer> uniqueIDList = new ArrayList<Integer>();
String[] projectNames;
int[] uniqueIds;

Connection conn1 = null;
Statement stmt1 = null;

JFrame frame = new JFrame("Admin Panel");
private JPanel panel = new JPanel();
JButton btnNewButton = new JButton("Add New Project");

public AdminClass() {
    panel.setLayout(null);
    JLabel label = new JLabel("Welcome to Admin Panel");
    label.setFont(new Font("Tahoma", Font.BOLD, 15));
    label.setBounds(148, 0, 188, 45);
    panel.add(label);
    btnNewButton.setForeground(Color.GREEN);
    btnNewButton.setFont(new Font("Yu Gothic", Font.BOLD, 13));
    btnNewButton.setBounds(0, 46, 482, 45);

    btnNewButton.addActionListener(this);
    panel.add(btnNewButton);

    JLabel label_1 = new JLabel("Existing Projects");
    label_1.setFont(new Font("Tunga", Font.BOLD, 15));
    label_1.setBounds(183, 90, 102, 45);
    panel.add(label_1);

    conn1 = sqliteConnection.dbConnector();

    try{
          Class.forName("org.sqlite.JDBC");
          conn1.setAutoCommit(false);
          stmt1 = conn1.createStatement();
          ResultSet rs1 = stmt1.executeQuery( "SELECT * FROM Project;" );

          List<String> projectNameList = new ArrayList<String>();

          while ( rs1.next() ){
              int id = rs1.getInt("uniqueid");
              String projectName = rs1.getString("name");

              projectNameList.add(projectName);
              uniqueIDList.add(id);
          }

          // Converting array list to array
          projectNames = new String[projectNameList.size()];
          projectNameList.toArray(projectNames);

          uniqueIds = convertIntegers(uniqueIDList);


          rs1.close();
          stmt1.close();
          conn1.close();
    }
    catch ( Exception e1 ) {
        JOptionPane.showMessageDialog(null, e1);    
    }

    // Adding buttons to the project
    try{
        for (int i = 0; i < projectNames.length; i++){
            buttons[i] = new ProjectButton(projectNames[i]);
            buttons[i].setId(uniqueIds[i]);

            panel.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    }
    catch (Exception e2){
        JOptionPane.showMessageDialog(null, e2);
    }

    frame.getContentPane().add(panel);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(25, 133, 430, 307);
    panel.add(scrollPane);
    frame.setVisible(true);
    frame.setSize(500, 500);

}

public void actionPerformed(ActionEvent e) {

    for (int j = 0; j < buttons.length; j ++){
        if (e.getSource() == buttons[j]){
            AdminStatus sc = new AdminStatus(buttons[j].getId());
            frame.dispose();
        }
    }

    if (e.getSource() == btnNewButton){

        frame.dispose();
        WindowProjectAdmin wpa = new WindowProjectAdmin();

    }

}

//Method to convert integar array list to integar array
public int[] convertIntegers(List<Integer> integers)
    {
        int[] ret = new int[integers.size()];
        for (int i=0; i < ret.length; i++)
        {
            ret[i] = integers.get(i).intValue();
        }
        return ret;
    }

}

I want buttons to spawn inside my scroller. Someone edit the code too if you can to fix it.


Solution

  • Using null Layout is generally not recommended. You should reconsider this approach.I would use for example GridLayout, this way your buttons should appear without problem.

    If you want to use null Layout, you should use setBounds(), on every component inside container with null Layout. So you need to "manually" choose it size and location on JPanel.

    Whats more, I think this is not good idea, to only display message on JOptionPane in case of exception, without printStackTrace(). This way it will by much harder to debug it.