有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJavaSwing(FileReader)读取txt。文件并写入JList可在Oo中随机工作

嗨 我正在开发一个JavaSwing应用程序,但是。。。我不太清楚,但我认为这可能是(重新)油漆问题:s-无论如何,这是我的代码:

主要内容:

public class QickSort {

protected static ArrayList<String> input;
private static File file = new File("C:/Users/save.txt");

public static void main(String[] args) throws Exception {

    BufferedReader reader;
    String line = null;

    try {
        input = new ArrayList<String>();

        reader = new BufferedReader(new FileReader(file));

        while ((line = reader.readLine()) != null) {
            input.add(line);
        }
        reader.close();

    } catch (Exception ex) {
        System.out.println("Can't load file on path.. - " + ex);
        ex.printStackTrace();
    }
    System.out.println(input.size());
    JFrame.setDefaultLookAndFeelDecorated(false);
    MasterWin win = new MasterWin(input);
}

}

用户界面:

public class MasterWin {

private JFrame frame;
private JTextField txtFieldPath;
private JButton btnBrowse;
private JButton btnAddPathTo;
private JLabel lblChosenFolderpaths;
private JButton btnRemove;
private JButton btnNext;
protected static ImageIcon icon = new ImageIcon(MasterWin.class.getResource("/View/logo_sml.gif"));
private JScrollPane scrollPane;
private JList linkList;
private List<String> test;

/**
 * Create the application.
 */
public MasterWin(ArrayList<String> fileInput) {
    test = fileInput;
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setIconImage(icon.getImage());
    frame.setTitle("QickSort - Start");
    frame.setResizable(false);
    frame.setBounds(100, 100, 645, 480);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridBagLayout gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{480, 127, 0};
    gridBagLayout.rowHeights = new int[]{135, 60, 0, 0, 0, 115, 0};
    gridBagLayout.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
    gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
    frame.getContentPane().setLayout(gridBagLayout);
    frame.setVisible(true);

    JLabel logo = new JLabel("");
    logo.setIcon(new ImageIcon(MasterWin.class.getResource("/View/Logo.gif")));
    GridBagConstraints gbc_logo = new GridBagConstraints();
    gbc_logo.fill = GridBagConstraints.HORIZONTAL;
    gbc_logo.gridwidth = 2;
    gbc_logo.insets = new Insets(0, 0, 5, 0);
    gbc_logo.anchor = GridBagConstraints.SOUTH;
    gbc_logo.gridx = 0;
    gbc_logo.gridy = 0;
    frame.getContentPane().add(logo, gbc_logo);

    JLabel lblChosePathYou = new JLabel("Choose paths you want to use:");
    GridBagConstraints gbc_lblChosePathYou = new GridBagConstraints();
    gbc_lblChosePathYou.anchor = GridBagConstraints.SOUTHWEST;
    gbc_lblChosePathYou.insets = new Insets(0, 60, 5, 5);
    gbc_lblChosePathYou.gridx = 0;
    gbc_lblChosePathYou.gridy = 1;
    frame.getContentPane().add(lblChosePathYou, gbc_lblChosePathYou);

    txtFieldPath = new JTextField();
    txtFieldPath.setEditable(false);
    GridBagConstraints gbc_txtFieldPath = new GridBagConstraints();
    gbc_txtFieldPath.fill = GridBagConstraints.HORIZONTAL;
    gbc_txtFieldPath.insets = new Insets(0, 60, 5, 5);
    gbc_txtFieldPath.gridx = 0;
    gbc_txtFieldPath.gridy = 2;
    frame.getContentPane().add(txtFieldPath, gbc_txtFieldPath);
    txtFieldPath.setColumns(10);

    btnBrowse = new JButton("Browse...");
    btnBrowse.setMinimumSize(new Dimension(89, 25));
    btnBrowse.setMaximumSize(new Dimension(89, 25));
    GridBagConstraints gbc_btnBrowse = new GridBagConstraints();
    gbc_btnBrowse.anchor = GridBagConstraints.WEST;
    gbc_btnBrowse.insets = new Insets(0, 10, 5, 0);
    gbc_btnBrowse.gridx = 1;
    gbc_btnBrowse.gridy = 2;
    frame.getContentPane().add(btnBrowse, gbc_btnBrowse);

    lblChosenFolderpaths = new JLabel("Chosen folderpaths:");
    GridBagConstraints gbc_lblChosenFolderpaths = new GridBagConstraints();
    gbc_lblChosenFolderpaths.anchor = GridBagConstraints.SOUTHWEST;
    gbc_lblChosenFolderpaths.insets = new Insets(0, 60, 5, 5);
    gbc_lblChosenFolderpaths.gridx = 0;
    gbc_lblChosenFolderpaths.gridy = 3;
    frame.getContentPane().add(lblChosenFolderpaths, gbc_lblChosenFolderpaths);

    btnAddPathTo = new JButton("Add to list");
    GridBagConstraints gbc_btnAddPathTo = new GridBagConstraints();
    gbc_btnAddPathTo.anchor = GridBagConstraints.WEST;
    gbc_btnAddPathTo.insets = new Insets(5, 10, 5, 0);
    gbc_btnAddPathTo.gridx = 1;
    gbc_btnAddPathTo.gridy = 3;
    frame.getContentPane().add(btnAddPathTo, gbc_btnAddPathTo);

    btnRemove = new JButton("Remove");
    btnRemove.setToolTipText("Delete selected path");
    btnRemove.setPreferredSize(new Dimension(89, 25));
    btnRemove.setMinimumSize(new Dimension(89, 25));
    btnRemove.setMaximumSize(new Dimension(89, 25));
    GridBagConstraints gbc_btnRemove = new GridBagConstraints();
    gbc_btnRemove.anchor = GridBagConstraints.NORTHWEST;
    gbc_btnRemove.insets = new Insets(5, 10, 5, 0);
    gbc_btnRemove.gridx = 1;
    gbc_btnRemove.gridy = 4;
    frame.getContentPane().add(btnRemove, gbc_btnRemove);

    btnNext = new JButton("Accept");
    btnNext.setPreferredSize(new Dimension(89, 25));
    btnNext.setMinimumSize(new Dimension(89, 25));
    btnNext.setMaximumSize(new Dimension(89, 25));
    GridBagConstraints gbc_btnNext = new GridBagConstraints();
    gbc_btnNext.anchor = GridBagConstraints.SOUTHWEST;
    gbc_btnNext.insets = new Insets(0, 10, 25, 0);
    gbc_btnNext.gridx = 1;
    gbc_btnNext.gridy = 5;
    frame.getContentPane().add(btnNext, gbc_btnNext);

    scrollPane = new JScrollPane();
    GridBagConstraints gbc_scrollPane = new GridBagConstraints();
    gbc_scrollPane.gridheight = 2;
    gbc_scrollPane.insets = new Insets(0, 60, 25, 5);
    gbc_scrollPane.fill = GridBagConstraints.BOTH;
    gbc_scrollPane.gridx = 0;
    gbc_scrollPane.gridy = 4;
    frame.getContentPane().add(scrollPane, gbc_scrollPane);
//JList I copy the array    
    linkList = new JList(test.toArray());
    scrollPane.setViewportView(linkList);
}

}

问题是: 真奇怪!有时文本会显示在我的JList上,但如果我再次启动程序,就会出现一个没有JList或输入的空滚动窗格。 文本的出现或多或少是随机的

我尝试了各种各样的数组(列表)来实现使用AbstractModel()命令,只需使用数组()。总是一样的结果

有人知道这个问题吗


共 (4) 个答案

  1. # 1 楼答案

    user268396关于布局验证的回答是正确的,但您根本不需要处于这种情况。布局无效,因为在JFrame可见后添加组件。只需将对frame.setVisible(true)的调用移动到initialize()方法的末尾,您就会看到问题消失了,因为布局现在已完成,它将在第一次验证并正确呈现

  2. # 2 楼答案

    更改:

    protected static ArrayList<String> input;
    

    致:

    protected static final ArrayList<String> input = new ArrayList<String>();
    

    删除main中对input的赋值

    将对swing代码的调用包装在invokeLater中:

    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(false);
                MasterWin win = new MasterWin(input);
            };
        });
    
  3. # 3 楼答案

    我解决了这个问题:

    我踢出了我的Scrollpane,只使用了一个JList。但这也不起作用

    在创建JList之后,我现在调用updateUI(),现在它可以工作了

  4. # 4 楼答案

    将列表设置为视口视图后,应在JList上调用invalidate(),这将告诉基础Swing图形系统它需要检查组件以及任何可能受影响的组件,无论这些组件是否需要更新

    不要调用repaint(),因为这样会触发组件的重新绘制,它不会确保其他受影响的组件也得到正确更新——而且因为这个JList被包装在一个JScrollPane中,所以它的行为不会像预期的那样