Daniel Lukish
Daniel Lukish

Reputation: 125

How to open JTable?

I have to program that takes ip Addresses from a file and outputs the country its in onto a JTable. I have no errors but when i click the button the JTable doesn't open up. How do i make the JTable open up?

package org.koushik.javabrains;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.io.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;

public class IPLocationFinder {
public static void main(String[] args) {
    final JFileChooser filechooser = new JFileChooser();
    filechooser.setVisible(false);
    final JTable jt;
    final String[] columns= {"IP address","Country"};
    final String[][] data = {{}};
    final DefaultTableModel model = new DefaultTableModel(data, columns);
    jt = new JTable(model);
    jt.setPreferredScrollableViewportSize(new Dimension(450, 60));
    jt.setFillsViewportHeight(true);
    JScrollPane jps = new JScrollPane();
    jt.add(jps);
    final JFrame frame = new JFrame();
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel(new GridBagLayout());
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    GridBagConstraints c = new GridBagConstraints();
    JButton b1 = new JButton("Start");
    c.gridx = 0;
    c.gridy = 0;
    c.insets = new Insets(10,10,10,10);
    panel.add(b1, c);
    frame.setBounds(400,150,600,200);

     ActionListener actionListener = new ActionListener() {

        public void actionPerformed(ActionEvent actionEvent) {



            new IPLocationFinder();
              BufferedReader inputStream = null;

              try {
                  inputStream = new BufferedReader(new FileReader("C:/IP Addresses/ip.txt"));
                  String l;
                  try {
                    while ((l = inputStream.readLine()) != null) {
                          String ipAddress = l;
                          GeoIPService ipService = new GeoIPService();
                          GeoIPServiceSoap geoIPServiceSoap = ipService.getGeoIPServiceSoap();
                          GeoIP geoIp = geoIPServiceSoap.getGeoIP(ipAddress);
                          model.addRow(new String[][]{{"Column 1", geoIp.getCountryName()}});
                      }
                } catch (IOException e) {
                    e.printStackTrace();
                }
              } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            } finally {
                  if (inputStream != null) {
                      try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                  }
            }
        }
     };
     b1.addActionListener(actionListener);
}
}

Upvotes: 0

Views: 532

Answers (2)

David Yee
David Yee

Reputation: 3646

You have several problems:

  1. You never add the JTable to your panel.

  2. You're adding a JScrollPane to your JTable when it should be the other way around. The JScrollPane should have its view set to the scrollable component, which in this case is the JTable. Otherwise, as your table's rows increase, the elements above it are simply going to be pushed up.

  3. You've added an empty row to your table by saying final String[][] data = { {} };. When you start adding rows, you'll have a blank row to start. Therefore, you should remove the inner curly braces.

  4. You should be aware that your JTable data is being prescribed as a 2D String array and although you're technically adding the data correctly, it's going to show up as an address in your first column:

JTable column with garbage being populated in the first column

To fix the above issue, change your addRow data to a 2D array such as model.addRow(new String[] { "Column 1", "Country 1" });

Below is a simplified, corrected version:

Fixed JTable with working addition of information

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class IPLocationFinder {
    public static void main(String[] args) {
        final String[] columns = { "IP address", "Country" };
        final String[][] data = {};
        final DefaultTableModel model = new DefaultTableModel(data, columns);
        final JTable jt = new JTable(model);
        final JFrame frame = new JFrame();
        final JScrollPane jps = new JScrollPane(jt);
        final JPanel panel = new JPanel(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();
        JButton b1 = new JButton("Start");
        c.gridx = 0;
        c.gridy = 0;
        c.insets = new Insets(10, 10, 10, 10);

        panel.add(b1, c);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel, BorderLayout.NORTH);
        frame.getContentPane().add(jps, BorderLayout.CENTER);

        ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                model.addRow(new String[] { "Column 1", "Country 1" });
            }
        };
        b1.addActionListener(actionListener);

        frame.pack();
        frame.setVisible(true);
    }
}

Upvotes: 3

slackmart
slackmart

Reputation: 4934

I'm gessing you're using a panel to show the jtable, however as you can notice, there's no a panel.add(jt); line.

So, go ahead and add that line inside the Action

EDIT

As @Braj comment, the jt must be added to the scroll. Then instead add the JTable, add the JScroll.

panel.add(jsp);

Upvotes: 1

Related Questions