JavaSwing (FileReader) читает txt.file и записывает в JList - случайно работает OO - PullRequest
2 голосов
/ 10 ноября 2010

Привет, я работаю над приложением JavaSwing, но есть проблема с ... Я не знаю точно, но я думаю, что это может быть (пере) проблема рисования: S - в любом случае вот мой код:

MAIN:

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);
}

}

UI:

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 - но если я снова запускаю программу, появляется просто пустая ScrollPane без JList или входных данных.Более или менее случайно, что текст появляется.

Я пробовал различные виды массивов (списков), чтобы включить.- с помощью AbstractModel () или просто toArray ().Всегда один и тот же результат ..

Кто-нибудь знает эту проблему?

Ответы [ 4 ]

1 голос
/ 10 ноября 2010

Изменение:

protected static ArrayList<String> input;

Кому:

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

Удалить назначение для input в основном.

Обернуть вызовы свинг-кода в invokeLater:

SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame.setDefaultLookAndFeelDecorated(false);
            MasterWin win = new MasterWin(input);
        };
    });
0 голосов
/ 23 декабря 2010

user268396 ответ о проверке макета является правильным, но вам никогда не нужно быть в этой ситуации в первую очередь. Ваш макет признан недействительным, потому что вы добавляете компоненты после того, как вы сделали JFrame видимым. Просто переместив вызов на frame.setVisible(true) в конец метода initialize(), вы увидите, что проблема исчезла, поскольку макет теперь завершен, и он будет правильно проверяться и отображаться в первый раз.

0 голосов
/ 12 ноября 2010

Я решил эту проблему:

Я выгнал свой Scrollpane и использовал только JList. Но это тоже не сработало.

Я звоню сейчас updateUI() после создания JList - теперь он работает.

0 голосов
/ 10 ноября 2010

После установки вашего списка в качестве вида окна просмотра вы должны вызвать invalidate() на JList, который сообщит базовой графической системе Swing, что она должна проверить компонент, а также любые возможные затронутые компоненты, требуют ли они обновления .

Делать , а не вызывать repaint(), потому что это вызовет перерисовку компонента в том виде, как он есть, это не будет гарантировать, что другие затронутые компоненты также будут должным образом обновлены - и потому что это JList завернутый в JScrollPane, он не будет вести себя как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...