- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想做什么:
我想列出数据库的一些记录。此列表应显示在 JFrame 弹出窗口中。
描述:
我有 3 个类:
为什么在将我的 JFrame 设置为可见时出现 ArrayIndexOutOfBoundsException?
更新:
似乎只有在我使用自己的 PeopleTable 类时才会出现此错误。当我将该表分配给一个普通的 JTable 时,它可以正常工作。
这是我得到的堆栈跟踪:
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
at javax.swing.JTable.getCellRect(JTable.java:2969)
at javax.swing.plaf.basic.BasicTableUI.createTableSize(BasicTableUI.java:1694)
at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(BasicTableUI.java:1733)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1660)
at javax.swing.ScrollPaneLayout.preferredLayoutSize(ScrollPaneLayout.java:495)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:917)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at java.awt.Window.pack(Window.java:809)
at ch.bs.jsd.personen.Main.main(Main.java:67)
这是我的全部代码:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class Main {
public static void main(String[] args) {
ArrayList<String[]> result = new ArrayList<String[]>();
SQLConnection sql = new SQLConnection();
String OBNr = "";
String firstName = "";
String lastName = "";
String qry = "SELECT loginid,ctitle as Grad,"
+ "name+' '+firstname as SachB,"
+ "cposition as Tour,Ressort,"
+ "left(location,2) as FNr "
+ "FROM dbo.abf_muPostenAdressen "
+ "WHERE loginid LIKE '%" + OBNr + "%'"
+ "AND name LIKE '%" + lastName + "%'"
+ "AND firstname LIKE '%" + firstName + "%'";
try {
ResultSet rs = sql.getConnection().prepareStatement(qry).executeQuery();
while (rs.next()) {
result.add(new String[]{
Integer.toString(rs.getRow()),
rs.getString("loginid"),
rs.getString("Grad"),
rs.getString("SachB"),
rs.getString("Tour"),
rs.getString("Ressort"),
rs.getString("FNr")
});
}
if (result.size() != 0) {
String[] selectedData = null;
if (result.size() > 1) {
String[] title = {"#", "loginid", "Grad", "SachB", "Tour",
"Ressort", "FNr"};
TableModel model = new PeopleTableModel(title, parse_2d_array(result));
JTable table = new PeopleTable(model);
JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(table));
frame.setVisible(true);
while (table.getSelectedRow() != -1) {
}
selectedData = result.get(table.getSelectedRow());
frame.dispose();
} else {
selectedData = result.get(0);
}
System.out.println(join(selectedData, ", "));
}
} catch (Exception e) {
e.printStackTrace();
}
sql.closeConnection();
}
private static String join(String[] s, String delimiter) {
if (s.length == 0) {
return null;
}
StringBuilder out = new StringBuilder();
out.append(s[0]);
for (int i = 1; i < s.length; ++i) {
out.append(delimiter).append(s[i]);
}
return out.toString();
}
private static String[][] parse_2d_array(ArrayList<String[]> al) {
String[][] data = new String[al.size()][6];
for (int i = 0; i < al.size(); i++) {
data[i] = al.get(i);
}
return data;
}
}
class PeopleTableModel extends AbstractTableModel {
private static final long serialVersionUID = -1080095595481949205L;
private String[] title;
private Object[][] data;
public PeopleTableModel(String[] title, Object[][] data) {
this.title = title;
this.data = data;
}
@Override
public int getColumnCount() {
return title.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public String getColumnName(int column) {
return title[column];
}
}
class PeopleTable extends JTable {
private static final long serialVersionUID = -1080095595481949205L;
private JTable table;
private int selectedRow = -1;
private StringBuilder pressedKeys = new StringBuilder();
private long now = 0;
private long last = 0;
public PeopleTable(TableModel model) {
table = new JTable(model);
table.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent e) {
if (e.getClickCount() == 2) {
setSelectedRow(table.rowAtPoint(e.getPoint()));
}
}
});
table.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent evt) {
}
@Override
public void keyReleased(KeyEvent evt) {
}
@Override
public void keyPressed(KeyEvent evt) {
int key = evt.getKeyCode();
// add only numbers
if ((key > 47 && key < 58) || (key > 95 && key < 106)) {
last = now == 0 ? 0 : now;
now = evt.getWhen();
if (now - last > 700) {
pressedKeys = new StringBuilder();
}
pressedKeys.append(evt.getKeyChar());
int row = Integer.parseInt(pressedKeys.toString()) - 1;
table.setRowSelectionInterval(row, row);
table.scrollRectToVisible(table.getCellRect(row, 0, true));
} else if (key == KeyEvent.VK_ENTER) {
if (pressedKeys.length() == 0) {
pressedKeys.append(1);
}
setSelectedRow(Integer.parseInt(pressedKeys.toString()) - 1);
}
}
});
}
public JTable getTable() {
return table;
}
private void setSelectedRow(int i) {
selectedRow = i;
}
@Override
public int getSelectedRow() {
return selectedRow;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public int getColumnCount() {
return table.getColumnCount();
}
@Override
public int getRowCount() {
return table.getRowCount();
}
@Override
public Object getValueAt(int row, int col) {
return table.getValueAt(row, col);
}
}
其他问题:是否有更好的方法来实现我的目标,或者这是否可以称为最佳实践?
最佳答案
我看不出有什么理由使用 AbstractTableModel
,不知道为什么 JTable
包含真实数量的行和列(最多 500
/1000
& 20
/50
),改为从 DefaultTableModel
开始
或使用此 AbstractTableModel 更改 DefaultTableModel
可以从
开始
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;
public class RemoveAddRows extends JFrame {
private static final long serialVersionUID = 1L;
private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
private Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50)},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
{"Sell", "Apple", new Integer(3000), new Double(7.35)},
{"Buy", "Nortel", new Integer(4000), new Double(20.00)}
};
private JTable table;
private DefaultTableModel model;
private javax.swing.Timer timer = null;
public RemoveAddRows() {
model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isRowSelected(row) && isColumnSelected(column)) {
((JComponent) c).setBorder(new LineBorder(Color.red));
}
return c;
}
};
ListSelectionModel rowSelMod = table.getSelectionModel();
rowSelMod.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
String str = "Selected Row(s): ";
int[] rows = table.getSelectedRows();
for (int i = 0; i < rows.length; i++) {
str += rows[i] + " ";
}
str += "Selected Column(s): ";
int[] cols = table.getSelectedColumns();
for (int i = 0; i < cols.length; i++) {
str += cols[i] + " ";
}
str += "Selected Cell: " + table.getSelectedRow() + ", " + table.getSelectedColumn();
System.out.println(str);
Object value = table.getValueAt(row, col);
System.out.println(String.valueOf(value));
}
});
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
JButton button1 = new JButton("Remove all rows");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (model.getRowCount() > 0) {
for (int i = model.getRowCount() - 1; i > -1; i--) {
model.removeRow(i);
}
}
System.out.println("model.getRowCount() --->" + model.getRowCount());
}
});
JButton button2 = new JButton("Add new rows");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
start();
}
});
JPanel southPanel = new JPanel();
southPanel.add(button1);
southPanel.add(button2);
add(southPanel, BorderLayout.SOUTH);
}
private void start() {
timer = new javax.swing.Timer(2500, updateCol());
timer.start();
}
public Action updateCol() {
return new AbstractAction("text load action") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
model.addRow(data0);
Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
model.addRow(data1);
Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
model.addRow(data2);
Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
model.addRow(data3);
System.out.println("model.getRowCount() --->" + model.getRowCount());
timer.stop();
int rowIndex = table.getRowCount() - 1;
table.changeSelection(rowIndex, 0, false, false);
}
};
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
System.out.println(info.getName());
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (UnsupportedLookAndFeelException e) {
// handle exception
} catch (ClassNotFoundException e) {
// handle exception
} catch (InstantiationException e) {
// handle exception
} catch (IllegalAccessException e) {
// handle exception
}
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
RemoveAddRows frame = new RemoveAddRows();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
关于java - 在 JFrame 中显示 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307743/
我正在尝试将 JFrame (bar) 添加到 JFrame (foo),这会强制 bar 在之前关闭foo 可以再次集成。 例如,在我可以再次编写代码之前,必须关闭“About Eclipse”框架
我有一个名为 User 的 JFrame,在其中声明一个名为 id 的变量,并根据某些条件将其设置为特定值。 我需要在称为输出的第二个 JFrame 中使用此变量。 这是我的代码 class Inpu
我有这个问题:我有一个 ArrayList,其中包含一些我想在特定框架中使用的项目,问题是数组列表通过在主类中初始化而变满我的项目。在本类(class)中,我还启动了与其他框架链接的起始框架(登录框架
如何在隐藏一个 Swing 程序的同时将一个 javax.Swing 程序移动到另一个 Swing 程序,以及如何制作可滚动的 JFrame。请帮助我。 最佳答案 在这里你可以找到一个非常good e
所以基本上我有一个 2D 游戏(基本上是过去的仿制品的链接),当你按 e 键时,库存会打开,关闭时会隐藏。问题是,每次我按 e 键时,它都会打开一个包含所有初始值的新库存,我希望它在初始值之后打开一个
我有一个 JFrame(1,主框架),它延续了 JPanel 和 JTable 以及数据。用户可以编辑数据。因此,一个新的 JFrame (2) 打开,用户可以输入新数据。如果他们在第二帧中单击“确定
我有一个新的netbeans“Java应用程序”项目,我试图从主JFrame添加第二个JFrame,用户可以从中加载文件。 所以我有主要的 JFrame main 方法 public static v
我的程序应该在单击按钮时启动第二个 JFrame 并打印一条语句,但它总是启动三个 JFrame 并打印三个语句。我只需要它来打印出一份声明并启动一个 Jframe。这是代码: import java
我目前已经构建了一个使用多个框架的应用程序。但如果我能在 1 帧中使用所有我用过的帧,那就太好了。如下图所示。 因此,如果您按左侧按钮“Speler Overzicht”,它将在右侧面板中向用户显示,
我目前有一个按钮,单击该按钮时,会执行一种方法,该方法创建一个带有加载多个图像的面板的 jframe。如果多次单击此按钮,图像将继续添加到加载到 jframe 上的现有图像上。我应该使用什么代码,以便
为什么无法将JFrame添加到JFrame中?它只是将一个组件添加到容器中。 Java 如何禁止我这样做?是的,我知道这样做没有意义,但我的问题的重点是了解 Swing 机制 - 它在幕后是如何工作的
我创建了一个生成 StartUpWindow 对象的类。其中一个 JButton 组件关闭 JFrame,然后调用一种新类型的框架进行实例化,AdminMainWindow。但是,当 AdminMai
我试图在不显示 JFrame 本身的情况下将 JFrame 渲染为图像(类似于 this 问题所问的内容)。我试过使用这段代码: private static BufferedImage getScr
我正在使用 XFCE 4 桌面的 Debian 8 上编译并运行以下代码。 import javax.swing.JFrame; import javax.swing.JComponent; impo
我有 14 个 JFrame 类和一个 JFrame 类,其中包含一个充当日历的 JTable。我希望当用户从 JTable 日历中选择日期时,更改 14 个 JFrame 类中任何一个文本字段或任何
我有 3 个扩展 JFrame 的对象让我们调用他们 FrameA FrameB FrameC . FrameA是我的主应用程序窗口。来自 FrameA的构造函数如果应用程序未注册我创建 FrameB
我试图简单地创建四个 jtextfields 和一个 jbutton。按下按钮后,我希望输入到 jtextfields 的文本作为参数(p、var、s、f)传递到另一个窗口,该窗口使用给定的参数显示数
这个问题已经有答案了: Close one JFrame without closing another? (2 个回答) 已关闭 6 年前。 我制作了一个程序,其中存在三个jframe。但问题是,当
我正在用 java 构建一个桌面学生管理应用程序。所以我需要关闭当前的 JFRAME,同时另一个 JFRAME 可见(关闭新的 jframe 后,旧的 jframe 应该可见)。你能帮我一下吗? 最佳
我正在开发的应用程序包含一个主 JFrame,用户最终可能会从中打开另一个补充框架。我正在尝试实现应用程序的这种行为,其中一旦主框架最小化,补充框架就会最小化(图标化)。 我正在考虑重写主框架的 se
我是一名优秀的程序员,十分优秀!