views:

505

answers:

2

Hi I have created a Jtable and can get it to show on my frame yet not on the JPanel I have ontop of my JFrame. I can't seem to change

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import javax.swing.*;
import javax.swing.table.*;

public class Main
{
    DefaultTableModel table_model;
    String[][] addressData = new String[10][5];
    JPanel panel;
    JFrame frame;
    JButton loadData;
    int count,index,row =0;
    String thisLine;
    ArrayList People = new ArrayList();

public Main()
{
    //Creating JFrame and setting properties
    frame = new JFrame();
    frame.setResizable(false);
    frame.setTitle("Address Book");
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);

    //Creating JPanel and setting properties
    panel = new JPanel();
    panel.setLayout(null);
    panel.setBackground(new Color(77,81,84));

    //Setting the table and Scroll Bars
    this.table_model = new DefaultTableModel(addressData, new String[]{"First Name", "Surname", "Home Number", "Mobile Number", "Address", "Postcode"});
    JTable table = new JTable(this.table_model);
    table.setBounds(130, 40, 200, 200);
    panel.add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));

    //Load Data button, reading file in and adding data to ArrayList then Array of Arrays
    loadData = new JButton("Load File");
    loadData.setBounds(10, 10, 100, 20);
    loadData.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                BufferedReader reader = new BufferedReader(new FileReader("file/address.buab"));
                while ((thisLine = reader.readLine()) !=null)
                {
                    if (row >= 4)
                    {
                        index++;
                        row = 0;
                        People.add(thisLine);
                        addressData[index][row] = People.get(count);
                        count++;
                        row++;
                    }
                    else
                    {
                    People.add(thisLine);
                    addressData[index][row] = People.get(count);
                    count++;
                    row++;
                    }
                }
                reader.close();
            }
            catch (IOException ex)
            {
                System.err.println("Input Exception, Check address.buab File");
            }
        }
    });
    panel.add(loadData);

    //Auto sort on table fields
    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.table_model);
    sorter.setComparator(1, new Comparator<Integer>()
    {
        public int compare(Integer o1, Integer o2)
        {
            return o1.compareTo(o2);
        }

        public boolean equals(Object obj)
        {
            return obj.equals(this);
        }
    });

    table.setRowSorter(sorter);

    frame.getContentPane().add(panel);
    frame.setVisible(true);
}

public static void main(String[] args)
{
    new Main();
}

}

Any ideas on how I might go about setting the table visible ontop of my JPanel

+1  A: 

A wild guess:

 panel.setLayout(null);

Try this instead:

 panel.setLayout(new BorderLayout());

And later:

 panel.add(loadData, BorderLayout.SOUTH) // e.g. for the button

 // e.g. for the table
 panel.add(new JScrollPane(table, .....)), BorderLayout.CENTER)
The MYYN
+2  A: 

You need to create your JPanel with a specific layout manager and then add components (the JTable and JButton) with appropriate constraints to cause them to appear in the correct area of the panel. Currently you are setting the panel's layout manager to null, which is almost certainly incorrect. You may want to check out the Using Layout Managers tutorial.

One simple layout manager to consider is BorderLayout. For example:

// Create JPanel with BorderLayout layout manager.
JPanel panel = new JPanel(new BorderLayout());

// Add JTable to panel center.  This component will expand
// to take up available space.
panel.add(myTableScrollPane, BorderLayout.CENTER);

// Add button to the bottom of the panel.
panel.add(myButton, BorderLayout.SOUTH);
Adamski