2012-01-26 4 views
1

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

WL

здесь кусок кода инициализации панели и добавить его в ScrollPane

 panel = new JPanel(); 

     scrollPane = new JScrollPane(panel); 

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

  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); 
+1

Сообщение пришел код пожалуйста. http://sscce.org – rtheunissen

+1

Если есть какая-либо путаница, опубликованный фрагмент кода не является SSCCE. –

ответ

2

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

revalidate(); 
repaint(); 

контейнера

+0

спасибо, что я их отсутствовал. теперь все хорошо :) – waqas

+0

+1 для грязного взлома – mKorbel

0

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

2

В отсутствие хорошего 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() и перекрасить() методы, как только сделали изменения ваших компонентов. Надеюсь, это может помочь в некотором роде.

С уважением

+0

Спасибо Gapandeep, я пропустил проверку и повторную проверку. теперь все хорошо :) – waqas

+0

@waqas: Рад, что вы сделали это через препятствие. :-) С уважением –

0

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

+0

Я не думаю, что вызов repaint() - лучшая вещь, которую нужно сделать (поскольку метод paint так или иначе вызван потоком GUI). Макет должен правильно рисовать, если макеты были правильно использованы, и код, который делает обновление, «вызывается» правильно. Но в отсутствие фрагмента ... –

2

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 (правда), как последней строки в свинг 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 

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

  • проверка поток из конца файла успешно, завернуть FileStream попробовать - поймать - наконец заблокировать, добавить в улове блок printStackTrace для отображения Exception

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

3)

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

  • Diplay это GUI

  • начиная Splash Screen

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

  • скрыть Начальный экран на FileStream закончился

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

+0

+1 для некоторых замечательных советов по работе. Могу скоро мне помочь :-) С уважением –

Смежные вопросы