2013-08-25 4 views
3

прежде всего я должен сказать, что я проверил эти вопросы и не нашел мой ответ:JScrollPane не работает для моего JPanel

1, 2, 3, 4, 5, 6, 7

и многие другие вопросы, как так

также я проверил эти учебники и примеры:

1, 9, 10, 11

и многие другие сайты. но я не мог исправить свою проблему.

и это простой вид моего кода:

public class Question extends JFrame { 
public Question() { 
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
    setLayout(new BorderLayout()); 
    setSize(d.width, d.height); 
    setResizable(false); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    JPanel panel = new JPanel(); 
    panel.setPreferredSize(new Dimension(d.width, d.height)); 
    panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
    panel.setLayout(new BoxLayout(panel, 1)); 
    for (int i = 0; i < 100; i++) { 
     panel.add(new JButton("kjdh")); 
    } 
    JScrollPane scrollPane = new JScrollPane(panel); 
    scrollPane.setPreferredSize(new Dimension(500, 500)); 
    getContentPane().add(scrollPane); 
    getContentPane().add(panel); 
    setVisible(true); 

} 

public static void main(String[] args) { 
    new Question(); 
} 
} 

но JScrollPane не появляется. Я много тестировал. Я изменил способ добавления panel и scrollPane в мой frame, но это не сработало. может ли кто-нибудь помочь мне плз?

+0

Вы пробовали scrollPane.add (панель), и добавление только панель? –

+0

Вы пробовали фреймворк для расчета размеров? И правильно, предпочтительный размер требует настройки настроек, используйте полный размер. –

+0

Вы уже добавили jpanel внутри scrollpane, поэтому нет необходимости добавлять jpanel снова в фрейм. Избегайте добавления ненужного кода, например, дважды добавляя jpanel. Просто удалите строку 'getContentPane(). Add (panel)'. –

ответ

13
  1. Не установить нужный размер на панели. См. Should I avoid the use of setPreferred/Maximum/MinimumSize methods in Java Swing? по причинам, почему.
  2. Добавить только панель прокрутки в область содержимого.
    1. Оконное содержимое с использованием макета по умолчанию (BorderLayout) будет по умолчанию, чтобы положить компонент в CENTER ограничения, если ни один не подается, а CENTER область может принимать только один компонент.
    2. Кроме того, панель уже добавлена ​​в панель прокрутки, она уже появится внутри нее и может отображаться только в одном контейнере.
  3. Не расширяйте рамку, просто используйте экземпляр одного.
  4. Не setSize, но setExtendedState.
  5. GUI следует создавать и обновлять на EDT.
  6. Лучшая закрытая операция - DISPOSE_ON_CLOSE.

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

public class Question { 

    public Question() { 
     JFrame f = new JFrame(); 
     f.setLayout(new BorderLayout()); 
     f.setResizable(false); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     panel.setLayout(new BoxLayout(panel, 1)); 
     for (int i = 0; i < 100; i++) { 
      panel.add(new JButton("kjdh")); 
     } 
     JScrollPane scrollPane = new JScrollPane(panel); 
     f.getContentPane().add(scrollPane); 
     f.pack(); 
     f.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       new Question(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+2

+1, гораздо лучше, как ответ, а не комментарий. Хотя, я бы смел 2, так как им нужно исправить проблему, а другая - хорошая практика программирования. – camickr

+0

@camickr Хорошая точка. Я отредактировал ответ, чтобы развернуть оба пункта и ** подчеркнуть ** 2-й. –

+0

Что делать, если я хочу, чтобы программа была в полноэкранном режиме? Я установил размер, чтобы сделать его полноэкранным – Paniz

5

Вы добавили ненужную дублируемую панель в контекстную панель. Вместо того, чтобы:

getContentPane().add(scrollPane); 
getContentPane().add(panel); 

использования только

getContentPane().add(scrollPane); 

Это имеет смысл, как стекло является приборами типа СПИРАЛЬНОГО контейнером для панели, так что это достаточно, чтобы добавить контейнер на контекстной панели.

+2

, пожалуйста, без scrollPane.setPreferredSize (новый размер (500, 500)) ;, потому что он заложен в JFrame.CENTER, то довольно игнорируется. – mKorbel

+0

Согласен с @mKorbel. См. [Не следует ли использовать методы setPreferred/Maximum/MinimumSize в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (в основном «да») и мой пример. Никаких «габаритных гадов» не требуется. –

+0

@ Jk1 спасибо, теперь хороший ответ – mKorbel

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