Содержимое не отображается без изменения размеров окон - PullRequest
1 голос
/ 26 января 2012

Я сделал небольшое приложение, чтобы открыть файл и показать содержимое открытого файла в некоторых JTextField и JLabels.Я могу получить все содержимое и заполнить поля TextFields и Labels, но проблема в том, что эти JLabels и JTextFields не отображаются до тех пор, пока я не изменю размеры (даже немного) окон.Я хочу, чтобы мое содержание было показано сразу.Что мне нужно сделать для этого.

WL

Вот фрагмент кода для инициализации панели и добавления его в scrollpane

        panel = new JPanel();

        scrollPane = new JScrollPane(panel);

В actionlistener ofкнопку открытия я получил следующий код

            int returnVal = fc.showOpenDialog(FileReader.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                String filePath = file.getPath();
               // if(panel.isDisplayable()==true)panel.
                if(scrollPane != null){
                    //panel.removeAll();    
                this.remove(scrollPane);
              //  scrollPane.add(panel);
                    //panel.add(panel);
                    //panel.validate();
                //panel.repaint();

                }
                //pass the file to XMLparser
                xmlParsing = new XMLParsing(filePath); 

                panel = new JPanel();


                panel=fill();
                panel.revalidate();
                panel.repaint();

          scrollPane = new JScrollPane(panel);

                add(scrollPane, BorderLayout.CENTER);
                //add(buttonPanel, BorderLayout.SOUTH);
                saveButton.setEnabled(true);
                saveasButton.setEnabled(true);

Ответы [ 5 ]

2 голосов
/ 26 января 2012

1)

but the problem is these JLabels and JTextFields are not shown untill 
and unless I resize(even a little) the windows. I want my contents to 
be shown straight away.

некоторые проблемы могут быть

  • setVisible (true) как последняя строка в конструкторе Swing GUI, проверьте и удалите дубликаты

  • основной метод должен быть включен в invokeLater

например,

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        setLayout(new GridBagLayout());// set LayoutManager
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();
        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 70;
        add(panel1, gbc); // add compoenet to the COntentPane
        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
        gbc.gridy = 1;
        gbc.weightx = 30;
        gbc.weighty = 30;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(panel2, gbc); // add component to the COntentPane
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important
        pack();
        setVisible(true); // important
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() { // important

            public void run() {
                BorderPanels borderPanels = new BorderPanels();
            }
        });
    }
}

2)

small application to open a file and show the contents of opened file 
in some JTextField and JLabels

должна быть вторая область, в которой ваш GUI не показывает JComponent или не имеет значения

  • проверьте, успешно ли закончился Stream from File, оберните FIleStream, чтобы попробовать - catch - finally блок, добавьте в блок catch printStackTrace для отображения Exception

  • в этой форме вы читаете данные во время основного потока, и весь GUI, ожидающий поток, закончился

3)

  • создать пустой графический интерфейс без каких-либо значений в JTextFIelds

  • отобразить этот графический интерфейс

  • запуск Заставка

  • перенаправить FileStream в Runnable # Thread или SwingWorker

  • скрыть заставку на FileStream закончилась

  • добавить значения в JTextFields

2 голосов
/ 26 января 2012

После добавления всех компонентов вызовите

revalidate();
repaint();

контейнера

2 голосов
/ 26 января 2012

В отсутствие хорошего SSCCE я предполагаю, что вы, должно быть, забыли поместить код, отвечающий за создание и отображение вашего кода, в потоке диспетчера событий.

Например:

public static void main(String... args)
{
    javax.swing.SwingUtilities.invokeLater(new Runnable()
       {
           public void run()
           {
               /* Put the method or code, which is responsible for 
                * creating and displaying your GUI, here.
                * That can be the issue too, what you are facing.
                */
           }
       });
}

И используйте методы validate () и repaint () после изменения компонентов. Надеюсь, что это может как-то помочь.

Привет

0 голосов
/ 26 января 2012

Вы должны вызвать .repaint() метод JFrame

0 голосов
/ 26 января 2012

В зависимости от того, как вы добавили свои компоненты и какой макет вы используете, вызов layout.pack () может решить вашу проблему. Возможно, добавление фрагмента кода также может облегчить вам задачу: D.

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