Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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 JScrollPane';拉吉';滚动,包含许多组件_Java_Performance_Swing_Jscrollpane - Fatal编程技术网

Java JScrollPane';拉吉';滚动,包含许多组件

Java JScrollPane';拉吉';滚动,包含许多组件,java,performance,swing,jscrollpane,Java,Performance,Swing,Jscrollpane,我有一张3045的表格!组件(1015个标签、1015个文本字段、1015个组合框)。它们都在JPanel中,JPanel在JScrollPane中。问题是滚动是“滞后的”。我的电脑里有4gb内存,所以我认为这不是问题所在。怎么了? 在我的任务管理器中,应用程序使用~100mb 我的代码: final JScrollPane scrollPane_1 = new JScrollPane(); final JPanel panel = new JPanel(); panel.setLayout(n

我有一张3045的表格!组件(1015个标签、1015个文本字段、1015个组合框)。它们都在JPanel中,JPanel在JScrollPane中。问题是滚动是“滞后的”。我的电脑里有4gb内存,所以我认为这不是问题所在。怎么了? 在我的任务管理器中,应用程序使用~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, y + 20, 200, 20);
            panel.add(text);
            panel.revalidate();
}
final JScrollPane scrollPane_1=new JScrollPane();
最终JPanel面板=新JPanel();
panel.setLayout(空);
滚动窗格_1.设置视口视图(面板);
int y=0;

对于(int i=0;i而言,在使用布局管理器时,您的代码对我来说似乎并不那么滞后。请测试以下内容:

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", Font.BOLD, 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);
   }
}
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.GridLayout;
导入javax.swing.*;
公开课2{
受保护的静态最终int PREF_W=400;
受保护的静态最终int PREF_H=400;
公共静态void main(字符串[]args){
final JScrollPane scrollPane_1=新JScrollPane(){
@凌驾
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
};
最终JPanel面板=新JPanel();
panel.setLayout(新的GridLayout(0,1));
滚动窗格_1.设置视口视图(面板);
对于(int i=0;i<1015;i++){
JPanel innerPanel=新的JPanel();
innerPanel.setLayout(新的BoxLayout(innerPanel,BoxLayout.LINE_轴));
JLabel长度=新JLabel(“foo”);
setFont(新字体(“Tahoma”,Font.BOLD,11));
length.setEnabled(false);
innerPanel.add(长度);
innerPanel.add(Box.createHorizontalGlue());
JComboBox组合=新的JComboBox();
combo.setPrototypeDisplayValue(“”);
setModel(新的DefaultComboxModel(新字符串[]{“=”,“!=”}));
combo.setMaximumSize(combo.getPreferredSize());
添加(组合);
JTextField text=新的JTextField(10);
JPanel textWrapper=新的JPanel();
textWrapper.add(文本);
添加(textWrapper);
panel.add(内部面板);
}
JFrame=新JFrame();
frame.add(滚动窗格_1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
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);
   }
}
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
公开课3{
受保护的静态最终int PREF_W=400;
受保护的静态最终int PREF_H=400;
公共静态void main(字符串[]args){
final JScrollPane scrollPane_1=新JScrollPane(){
@凌驾
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
};
String[]columnNames={“Foo”,“Bar”,“Baz”};
字符串[][]数据=新字符串[1015][3];
对于(int i=0;i
所有天真的Swing程序员的注意事项:所有Swing对象的创建和操作都必须在AWT事件线程上完成,在从不同线程调用时,以可运行的方式添加到事件线程中,否则会发生不好的事情

e、 g


另外,如果需要从Swing启动非Swing代码并在完成后运行Swing代码,请学习如何使用SwingWorker。

这可能是您使用的JDK存在的问题。我在使用JDK 1.8.045时也遇到过类似的问题

将JDK降级到1.8.031应该可以解决组合框滞后于滚动的问题


或者,将
-Dsun.java2d.opengl=true
添加到您的VM参数中。

您的代码在许多方面都有问题。首先,您不应该使用null布局,而尝试将null布局容器添加到JScrollPane的视口中则是大错特错。因此,我无法测试您的代码。但为了我的钱,我会使用JTable来代替它。请继续重复多次验证是完全不必要的,但不会引起他的主要问题。我的表单是JCudio,我的容器有GoLoopPo.Outlook只为组件创建面板。如果我没有空布局,所有组件都被画成“行”…@ USE1005633:考虑使用其他布局。回答下面的问题。好的,我尝试了代码,但卷轴再次出现滞后…我不知道出了什么问题:-(@user1005633:您的代码,使用HFOE的完整示例作为参考。@Hovercraft充满了鳗鱼,好的,JTable不是laggy,但是为什么当我使用组件时卷轴是laggy?我做了很多测试,我意识到只有当我使用组合框时才会存在滞后,如果我使用eg文本字段而不是组合框,卷轴是正常的…我也明白了使用Comboboxes时会出现这种延迟。如果你有足够的代表发表评论,请将这样的回答作为评论,而不是问题的答案(事实并非如此)。+1帮助解决“代表”问题。。
 public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        // Swing object creation and modification code!
      }
    });
 }