JScrollPane не работает, когда я добавляю menuBar

Несколько месяцев назад я задал вопрос, похожий на этот: здесь проблема была решено, но как только я добавлю свой menuBar в этот код, панель прокрутки снова исчезла. это мой новый код:

public class Question {

int count = 0;
ArrayList<JTextField>[] jt;

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

    JMenu mnu1 = new JMenu("ثبت");
    mnu1.setMnemonic(KeyEvent.VK_E);

    JMenuItem menuItem = new JMenuItem("Insert Places", KeyEvent.VK_T);
    menuItem.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {

            count = 0;
            jt = new ArrayList[4];
            for (int i = 0; i < 4; i++)
                jt[i] = new ArrayList<JTextField>();


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

    mnu1.add(menuItem);
    mnuBar.add(mnu1);
    f.setJMenuBar(mnuBar);
    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);
} 
}

спасибо в отношении


person Paniz    schedule 28.11.2013    source источник


Ответы (2)


но как только я добавляю свой menuBar в этот код, панель прокрутки снова исчезает. это мой новый код:

Поскольку вы не добавляете JScrollPane на панель содержимого до того, как какое-либо действие будет выполнено на MenuItem.

  1. Объявите JScrollPane и JPanel в контексте вашего класса, а не в функции.
  2. Добавьте JScrollPane и JPanel, которые должны содержать ваш JButtons
  3. Когда событие действия выполняется на MenuItem, добавьте кнопку на JPanel и вызовите на ней revalidate().
  4. Я не рекомендую вызывать validate()/revalidate() на панели содержимого JFrame. вызовите revalidate() только для компонента, макет которого был изменен: в вашем контексте это панель, содержащая JButton.
  5. И, как правило, не забывайте также звонить repaint().

Таким образом, ваше полное решение станет:

class Question {

int count = 0;
ArrayList<JTextField>[] jt;
JPanel buttonPanel;;
JScrollPane scrollPane;

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

    JMenu mnu1 = new JMenu("ثبت");
    mnu1.setMnemonic(KeyEvent.VK_E);

    buttonPanel = new JPanel();
    buttonPanel.setBorder(BorderFactory.createLineBorder(Color.red));
    buttonPanel.setLayout(new BoxLayout(buttonPanel, 1));

    scrollPane  = new JScrollPane(buttonPanel);
    f.getContentPane().add(scrollPane);

    JMenuItem menuItem = new JMenuItem("Insert Places", KeyEvent.VK_T);
    menuItem.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {

            count = 0;
            jt = new ArrayList[4];
            for (int i = 0; i < 4; i++)
                jt[i] = new ArrayList<JTextField>();


           for (int i = 0; i < 100; i++) {
                buttonPanel.add(new JButton("kjdh"));
           }

           buttonPanel.revalidate(); // calling revalidate 
           buttonPanel.repaint();// calling repaint

        }
    });

    mnu1.add(menuItem);
    mnuBar.add(mnu1);
    f.setJMenuBar(mnuBar);
    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);
} 
}
person Sage    schedule 28.11.2013

Добавьте f.revalidate(); в ActionListener.

 menuItem.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
    .................

    JScrollPane scrollPane = new JScrollPane(panel);
    f.getContentPane().add(scrollPane);

    f.revalidate();  // Add this method with JFrame

    }

   });
person Masudul    schedule 28.11.2013
comment
моя Java не распознает revalidate() как насчет validate()? - person Paniz; 28.11.2013
comment
Если вы используете меньше, чем JDK-1.7, используйте validate(). - person Masudul; 28.11.2013
comment
в этом коде это работает, потому что он должен добавить его с самого начала, но в моем полном коде, где он должен добавить jscrollpane, когда элементы не помещаются на экране, он еще не работает :( - person Paniz; 28.11.2013
comment
@Paniz, я не знаю, почему твой полный код не работает. Обратите внимание, что панель прокрутки появится на экране, когда компоненты станут больше экрана. - person Masudul; 28.11.2013
comment
он появляется динамически? Я имею в виду, когда я добавляю некоторые компоненты один за другим (например, нажимая кнопку), как только они становятся больше, это появляется? - person Paniz; 28.11.2013
comment
@Paniz, да, это появляется динамически. - person Masudul; 28.11.2013