0

I am building a swing application for a course. After I add my JTable to the panel, the table grids and column headers are not showing. Instead a white box appears in the panel where the table was supposed to be. Why is this happening and how to fix it ?

public class ReminderGui implements ActionListener {
JFrame frame;
JPanel panel;
JLabel lblTitle,lblDetails,lblDate,lblTime;
JTextField titleField,dateField;
JTextArea detailsArea;
JButton addButton,cancelButton,rmvButton,rmvallButton,editButton;
JTable table;
JComboBox<String> hourcbo,minutecbo,ampmcbo;
ArrayList<Reminder> remList;


final String hour[]={"12","1","2","3","4","5","6","7","8","9","10","11"};
final String minute[]={"00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20",
                     "21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40",
                     "41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"
                    };
final String ampm[]={"AM","PM"};
String[] columnname={"Reminder Name", "Reminder Detail","Reminder Date","Reminder Time"};


public ReminderGui() throws FileNotFoundException, IOException, ClassNotFoundException{

    panel=new JPanel();
    panel.setLayout(null);

    lblTitle=new JLabel("Reminder Title");
    lblDetails=new JLabel("Reminder Details");
    lblDate=new JLabel("Set Date(date/motnth/year)");
    lblTime=new JLabel("Set Time");

    titleField=new JTextField();
    titleField.setMargin(new Insets(5,5,5,5));


    detailsArea=new JTextArea(10,20);
    detailsArea.setLineWrap(true);
    detailsArea.setMargin(new Insets(5,5,5,5));
    JScrollPane scroller1=new JScrollPane(detailsArea);
    scroller1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroller1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);


    //date and time component     

    dateField=new JTextField();
    dateField.setMargin(new Insets(5,5,5,5));


    hourcbo=new JComboBox<String>(hour);
    hourcbo.setBackground(Color.white);
    minutecbo=new JComboBox<String>(minute);
    minutecbo.setBackground(Color.white);
    ampmcbo=new JComboBox<String>(ampm);
    ampmcbo.setBackground(Color.white);

    addButton=new JButton("Add");
    cancelButton=new JButton("Cancel");
    editButton=new JButton("Edit");
    rmvButton=new JButton("Remove Selected");
    rmvallButton=new JButton("Remove all");  



    lblTitle.setBounds(30, 30, 100, 30);
    panel.add(lblTitle);
    titleField.setBounds(150, 30, 400, 30);
    panel.add(titleField);
    lblDetails.setBounds(30, 80, 100, 30);
    panel.add(lblDetails);
    scroller1.setBounds(150, 80, 400, 200);
    panel.add(scroller1);
    lblDate.setBounds(30, 310, 170, 30);
    panel.add(lblDate);
    dateField.setBounds(210, 310, 100, 30);
    panel.add(dateField);
    lblTime.setBounds(340, 310, 50, 30);
    panel.add(lblTime);
    hourcbo.setBounds(400, 310, 100, 30);
    minutecbo.setBounds(510, 310, 100, 30);
    ampmcbo.setBounds(620, 310, 100, 30);
    panel.add(hourcbo);
    panel.add(minutecbo);
    panel.add(ampmcbo);
    addButton.setBounds(30,380,100,30);
    panel.add(addButton);
    cancelButton.setBounds(160,380,100,30);
    panel.add(cancelButton);



    File file=new File("appFile.chk");
    Object[][] data = null;
    if(!(file.exists())){
        remList=new ArrayList<Reminder>();
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(remList);
    oos.flush();
    oos.close();
    }

        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
        remList=(ArrayList<Reminder>)ois.readObject();
        int rownum=remList.size();
        data=new String[rownum][4];
        Iterator<Reminder> it=remList.iterator();
        Reminder rem=null;
        for(int i=0;i<rownum;i++){
            if(it.hasNext()){
                rem=it.next();
            }

            data[i][0]=rem.getReminderTitle();
            data[i][1]=rem.getReminderDetails();
            data[i][2]=rem.getReminderDate();
            data[i][3]=rem.getReminderTime();
        }

        ois.close();



    //jtable

    table=new JTable(data,columnname);
    table.setBounds(160,450,400,300);


    JScrollPane scroller2=new JScrollPane(table);
    scroller1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroller1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    panel.add(table);


    addButton.addActionListener(this);
    cancelButton.addActionListener(this);
    editButton.addActionListener(this);
    rmvButton.addActionListener(this);
    rmvallButton.addActionListener(this);



    //set framesize when other works are done
    frame=new JFrame("RemindMe!");
    frame.add(panel);
    frame.setSize(850,840); 
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
}

@Override
public void actionPerformed(ActionEvent e) {
    //throw new UnsupportedOperationException("Not supported yet.");
    if(e.getSource()==addButton){
        String s1=(String)titleField.getText();
        String s2=(String)detailsArea.getText();
        String s3=(String)dateField.getText();
        String s4=(String)hourcbo.getSelectedItem()+":"+(String)minutecbo.getSelectedItem()+" "+(String)ampmcbo.getSelectedItem();

    }
    else if(e.getSource()==cancelButton){
        titleField.setText("");
        detailsArea.setText("");
        dateField.setText("");

    }



}
James Z
  • 12,209
  • 10
  • 24
  • 44

1 Answers1

2

You've added the JTable to more than one container -- both the JScrollPane's viewport (good) and also to the panel JPanel (bad). This second action removes the JTable from the JScrollPane, so that later when you add the JScrollPane to panel, it holds nothing.

JScrollPane scroller2=new JScrollPane(table);

Good!

panel.add(table);

Bad!

Solution: don't do that. Add your components to one and only one container.

Other problems:

panel.setLayout(null);

Don't use null layouts, as these lead to fragile GUI's that look sort-of OK on one platform and not so good on others, and that are very difficult to debug and enhance. Learn and use the layout managers.

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • What solved the problem, is setting bounds to scroller2 instead of table. But thanks for your help and suggestion. – Nirjhar Dasgupta Nov 11 '17 at 20:45
  • 1
    @NirjharDasgupta: Seriously, don't use null layouts and setBounds as you're setting yourself up for heartache with this. – Hovercraft Full Of Eels Nov 11 '17 at 20:46
  • 1
    *"What solved the problem, is setting bounds to scroller2 instead of table."* How do you intend to solve the 5+ problems that cascade from using no layout? Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or [combinations of them](http://stackoverflow.com/a/5630271/418556) along with layout padding and borders for [white space](http://stackoverflow.com/a/17874718/418556). Seriously, follow the strategy outlined by @HovercraftFullOfEels. – Andrew Thompson Nov 12 '17 at 16:39