Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何打开JTable?_Java_Swing_Jtable_Actionlistener - Fatal编程技术网

Java 如何打开JTable?

Java 如何打开JTable?,java,swing,jtable,actionlistener,Java,Swing,Jtable,Actionlistener,我必须编写一个程序,从文件中获取ip地址,并将其所在国家输出到JTable上。我没有错误,但当我单击按钮时,JTable不会打开。如何打开JTable package org.koushik.javabrains; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.io.*; import java.awt.*; import java.awt.event.ActionEvent; imp

我必须编写一个程序,从文件中获取ip地址,并将其所在国家输出到JTable上。我没有错误,但当我单击按钮时,JTable不会打开。如何打开JTable

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);
}
}

我认为您正在使用一个面板来显示jtable,但是正如您所注意到的,没有一个
panel.add(jt)

所以,继续,在动作中添加这一行

编辑

作为@Braj comment,jt必须添加到滚动条中。然后添加JTable,添加JScroll

panel.add(jsp);

我认为您正在使用一个面板来显示jtable,但是正如您所注意到的,没有一个
panel.add(jt)

所以,继续,在动作中添加这一行

编辑

作为@Braj comment,jt必须添加到滚动条中。然后添加JTable,添加JScroll

panel.add(jsp);

您有几个问题:

  • 您从不将
    JTable
    添加到面板中

  • 您正在将一个
    JScrollPane
    添加到
    JTable
    中,而实际情况正好相反。
    JScrollPane
    应将其视图设置为可滚动组件,在本例中为
    JTable
    。否则,随着表的行数增加,上面的元素将被推上

  • 您在表中添加了一个空行,方法是说
    final String[][]data={{}。开始添加行时,将有一个空行开始。因此,您应该删除内部花括号

  • 您应该知道,您的JTable数据被指定为2D字符串数组,尽管您在技术上正确添加了数据,但它将在您的第一列中显示为地址:

  • 要解决上述问题,请将
    addRow
    数据更改为二维数组,例如
    model.addRow(新字符串[]{“Column 1”,“Country 1”)

    以下是一个简化、更正的版本:

    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);
        }
    }
    


    您有几个问题:

  • 您从不将
    JTable
    添加到面板中

  • 您正在将一个
    JScrollPane
    添加到
    JTable
    中,而实际情况正好相反。
    JScrollPane
    应将其视图设置为可滚动组件,在本例中为
    JTable
    。否则,随着表的行数增加,上面的元素将被推上

  • 您在表中添加了一个空行,方法是说
    final String[][]data={{}。开始添加行时,将有一个空行开始。因此,您应该删除内部花括号

  • 您应该知道,您的JTable数据被指定为2D字符串数组,尽管您在技术上正确添加了数据,但它将在您的第一列中显示为地址:

  • 要解决上述问题,请将
    addRow
    数据更改为二维数组,例如
    model.addRow(新字符串[]{“Column 1”,“Country 1”)

    以下是一个简化、更正的版本:

    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);
        }
    }
    


    JScrollPane
    内部添加
    JTable
    ,而不是相反<代码>jt.add(jps)不正确相反,它应该像
    JScrollPane jps=newjscrollpane(jt)
    或调用
    jps.setView(jt)
    补充@Braj的评论,将
    JScrollPane
    添加到
    JPanel
    中,以显示仍未获取该表的表。我添加了你们所说的内容,但没有任何更改也避免使用
    null
    布局,而是尝试在
    JScrollPane
    内部添加
    JTable
    <代码>jt.add(jps)不正确相反,它应该像
    JScrollPane jps=newjscrollpane(jt)
    或调用
    jps.setView(jt)
    补充@Braj的评论,将
    JScrollPane
    添加到
    JPanel
    中,以显示仍未获取该表的表。我添加了你们所说的内容,但没有任何更改也避免使用
    null
    layout,而是尝试一个仍然不弹出表直到不弹出表