【发布时间】:2014-03-07 09:29:28
【问题描述】:
我正在开发一段我一直在修补的代码的 GUI。我被困在程序的这一部分,我希望用户选择的数据文件以预览方式显示在JTable 中(即用户不应该能够编辑表格上的数据)。
单击“实验参数”选项卡中的按钮(参见下面的屏幕截图),我创建并运行一个“PreviewAction”,它创建一个新选项卡,并用必要的组件填充它。以下是DataPreviewAction 的代码。 编辑:我还发布了一个self-contained, minimal version,它模仿了实际项目中的条件,并表现出相同的行为。
import java.awt.BorderLayout;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class MyFrame extends JFrame {
private JPanel panel1;
private JTabbedPane tabs;
private JButton runButton;
public MyFrame() {
tabs = new JTabbedPane();
panel1 = new JPanel();
runButton = new JButton("go!");
runButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
runButtonActionPerformed(evt);
}
});
panel1.add(runButton);
tabs.addTab("first tab", panel1);
this.add(tabs);
pack();
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
}
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {
/*
* Normally there is more stuff happening here but this much will do for
* the sake of example
*/
List<String[]> data = new LinkedList<String[]>();
for (int i = 1; i < 1000; i++)
data.add(new String[] { "entry1", "value1", "value2", "value3" });
SwingUtilities.invokeLater(new DataPreviewAction(data, tabs));
}
public class DataPreviewAction implements Runnable {
private JTabbedPane contentHolder;
private List<String[]> data;
public DataPreviewAction(List<String[]> data, JTabbedPane comp) {
this.contentHolder = comp;
this.data = data;
}
@Override
public void run() {
DefaultTableModel previewModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
for (String[] datarow : data) {
previewModel.addRow(Arrays.copyOf(datarow, datarow.length,
Object[].class));
}
JTable table = new JTable(previewModel);
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton("A button"));
buttonPanel.add(new JLabel(
"Some description for the awesome table below "));
buttonPanel.add(new JButton("another button"));
JScrollPane tablePanel = new JScrollPane(table);
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
container.add(buttonPanel, BorderLayout.NORTH);
container.add(tablePanel, BorderLayout.CENTER);
contentHolder.addTab("Preview", container);
contentHolder.validate();
contentHolder.repaint();
}
}
}
这里至少有两个问题:
-
JTable(或JScrollPane)根本不渲染 -
JScrollPane没有框架本身那么宽,我不知道为什么
我在 Swing 方面并不是那么好,所以我可能会遗漏一些基本的东西。我检查了数据文件是否被正确读取,并且数据模型包含正确数量的行(1000+)。所以表不应该是空的。
建议?
【问题讨论】:
-
为了尽快获得更好的帮助,请发布MCTaRE(经过测试和可读的最小完整示例)。
-
您是从哪里以及如何调用此代码的?
-
@Sanjeev 如果 OP 添加了 MCTaRE,您的两个问题都会得到解答。
-
@AndrewThompson 添加了一个指向 pastebin 的链接,一个单一的类,它几乎模仿了与真实代码相同的条件,减去了一整块其他组件和动作侦听器等
-
"添加了一个指向 pastebin 的链接.." 如果是 MCTaRE,它应该足够短,可以编辑到问题中。
标签: java swing user-interface jtable jscrollpane