Java 如何打开JTable?
我必须编写一个程序,从文件中获取ip地址,并将其所在国家输出到JTable上。我没有错误,但当我单击按钮时,JTable不会打开。如何打开JTableJava 如何打开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
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,而是尝试一个仍然不弹出表直到不弹出表