java – JScrollPane’laggy’滚动,包含许多组件
发布时间:2020-12-15 04:11:15 所属栏目:Java 来源:网络整理
导读:我有3045的表格!组件(1015个标签,1015个文本字段,1015个组合框).所有这些都在JPanel和JScrollPane中的JPanel中.问题是滚动是“滞后”.我的PC上有4GB RAM,所以我不认为这是问题所在.怎么了? 在我的任务管理器中,应用程序使用~100mb. 我的代码: final JScro
我有3045的表格!组件(1015个标签,1015个文本字段,1015个组合框).所有这些都在JPanel和JScrollPane中的JPanel中.问题是滚动是“滞后”.我的PC上有4GB RAM,所以我不认为这是问题所在.怎么了?
在我的任务管理器中,应用程序使用~100mb. 我的代码: final JScrollPane scrollPane_1 = new JScrollPane(); final JPanel panel = new JPanel(); panel.setLayout(null); scrollPane_1.setViewportView(panel); int y =0; for(int i=0; i<1015;i++) { JLabel length = new JLabel(); length.setBounds(10,y,350,20); length.setFont(new Font("Tahoma",Font.BOLD,11)); length.setEnabled(false); panel.add(length); panel.revalidate(); JComboBox combo = new JComboBox(); combo.setModel(new DefaultComboBoxModel(new String[] {"=","!="})); combo.setBounds(10,y + 20,70,20); panel.add(combo); panel.revalidate(); JTextField text = new JTextField(); text.setBounds(10 + 80,200,20); panel.add(text); panel.revalidate(); } 编辑:我做了很多测试,我意识到只有当我使用组合框时才存在延迟,如果我使用例如文本字段而不是组合框,滚动是正常的… 解决方法
使用布局管理器时,您的代码对我来说似乎并不那么迟钝.请测试一下:
import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import javax.swing.*; public class Foo2 { protected static final int PREF_W = 400; protected static final int PREF_H = 400; public static void main(String[] args) { final JScrollPane scrollPane_1 = new JScrollPane() { @Override public Dimension getPreferredSize() { return new Dimension(PREF_W,PREF_H); } }; final JPanel panel = new JPanel(); panel.setLayout(new GridLayout(0,1)); scrollPane_1.setViewportView(panel); for (int i = 0; i < 1015; i++) { JPanel innerPanel = new JPanel(); innerPanel.setLayout(new BoxLayout(innerPanel,BoxLayout.LINE_AXIS)); JLabel length = new JLabel("foo"); length.setFont(new Font("Tahoma",11)); length.setEnabled(false); innerPanel.add(length); innerPanel.add(Box.createHorizontalGlue()); JComboBox<String> combo = new JComboBox<String>(); combo.setPrototypeDisplayValue(" "); combo.setModel(new DefaultComboBoxModel<String>(new String[] { "=","!=" })); combo.setMaximumSize(combo.getPreferredSize()); innerPanel.add(combo); JTextField text = new JTextField(10); JPanel textWrapper = new JPanel(); textWrapper.add(text); innerPanel.add(textWrapper); panel.add(innerPanel); } JFrame frame = new JFrame(); frame.add(scrollPane_1); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } 编辑 相反,使用JTable怎么样? import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.*; import javax.swing.table.DefaultTableModel; public class Foo3 { protected static final int PREF_W = 400; protected static final int PREF_H = 400; public static void main(String[] args) { final JScrollPane scrollPane_1 = new JScrollPane() { @Override public Dimension getPreferredSize() { return new Dimension(PREF_W,PREF_H); } }; String[] columnNames = {"Foo","Bar","Baz"}; String[][] data = new String[1015][3]; for (int i = 0; i < data.length; i++) { data[i] = new String[]{"foo","==",""}; } DefaultTableModel model = new DefaultTableModel(data,columnNames){ @Override public boolean isCellEditable(int row,int column) { return (column != 0); } }; JTable table = new JTable(model); table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor( new JComboBox<String>(new String[]{"==","!="}))); final JPanel panel = new JPanel(); panel.setLayout(new GridLayout(0,1)); scrollPane_1.setViewportView(table); JFrame frame = new JFrame(); frame.add(scrollPane_1); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |