2015-01-07 3 views
0

Итак, у меня есть класс с именем AppMain, который расширяет JFrame и JPanel (называемую панелью), где я добавляю различные компоненты JSwing (кнопки, метки, разделители), которые пользователь может нажать для различных действий. Одним из таких действий является (во время выполнения) добавить целый JPanel с различными JSpinners и TextAreas. Детали этого находятся в классе, называемом PlayerCharacter, который расширяет JPanel. Когда вы создаете много панелей, вы выходите из вертикального пространства, и никакая полоса прокрутки не создается автоматически. Моя проблема заключается в том, как добавить полосу прокрутки. Я попытался создать ScrollPane, в который я положил вторую панель.Добавление вертикальной прокрутки к JPanel

код выглядит немного как это:

public class AppMain extends JFrame { 

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

private static JPanel panel = new JPanel(); 
private static JPanel contentPanel = new JPanel(); 
JScrollPane scrollPane = new JScrollPane(contentPanel); 
JButton addPlayerButton = new JButton("Add player"); 

AppMain() { 
    super("window name"); 
    setSize(1200, 750); 
    setLocation(250, 50); 
    panel.setLayout(null); 
    contentPanel.setLayout(null); 
    addPlayerButton.setBounds(5, 5, 150, 40); 
    contentPanel.setBounds(5, 10, 1100, 750); 
    scrollPane.setBounds(5, 10, 1100, 750); 
    panel.add(addPlayerButton); 
    panel.add(scrollPane); 
    getContentPane().add(panel); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    interfaceControls(); 
} 

public void interfaceControls() { 
    addPlayerButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 

        for (int i = 0; i < 8; i++){ 
        JLabel tmpLabel = new JLabel("text " + i); 
        tmpLabel.setBounds(5, (100 + (100 * i)), 100, 100); 
        contentPanel.add(tmpLabel); 
        contentPanel.revalidate(); 
        contentPanel.repaint(); 
        } 
       } 

      }); 
     } 
    }); 

} 
} 

EDIT: и для тех, кому интересно код, который работает:

public class AppMain extends JFrame { 

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

private static JPanel panel = new JPanel(); 
JPanel topPanel = new JPanel(); 
JPanel contentPanel = new JPanel(); 
JButton addPlayerButton = new JButton("Add player"); 



AppMain() { 
    super("window name"); 
    setSize(1200, 750); 
    setLocation(250, 50); 
    JScrollPane scrollPanel = new JScrollPane(contentPanel); 

    panel.setLayout(new BorderLayout()); 

    contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); 
    panel.add(addPlayerButton, BorderLayout.PAGE_START); 
    panel.add(scrollPanel, BorderLayout.CENTER); 

    getContentPane().add(panel); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    interfaceControls(); 
} 

public void interfaceControls() { 
    addPlayerButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 

        for (int i = 0; i < 8; i++){ 
        JButton dynamicButton = new JButton("text " + i); 
        contentPanel.add(dynamicButton); 
        contentPanel.revalidate(); 
        contentPanel.repaint(); 
        } 
       } 

      }); 
     } 
    }); 

} 

}

+0

Лучшим было бы предоставить [mcve] (http://stackoverflow.com/help/mcve), которые воспроизводят проблему. –

ответ

3

Я не против обмена проект, но я не уверен, насколько безопасно это

Мы НИКОГДА не хотим видеть вас в полном объеме. Это слишком много кода для просмотра. Вместо этого мы хотим видеть SSCCE, который является упрощенным кодом, который демонстрирует «концепцию» того, что вы пытаетесь сделать.

SSCCE должен быть включен в список всех вопросов. Редко отправляя 4 строки кода, мы предоставим нам информацию, необходимую для решения вашей проблемы. Другим преимуществом SSCCE является то, что вы часто обнаруживаете проблему при попытке создать SSCCE, потому что найти проблему в 20 строках кода проще, чем отлаживать 200 строк кода.

contentPanel.add(newPlayerCharacter); 
panel.validate(); 
panel.repaint(); 

Нормальный код должен быть:

contentPanel.add(newPlayerCharacter); 
contentPanel.revalidate(); // note the "re" 
contentPanel.repaint(); 

Если это не поможет, то опубликовать надлежащий SSCCE в этом вопросе.

Edit:

Не используйте пустые макеты (и SetBounds()) !!!

Свинг предназначен для использования с менеджерами макетов. Я не знаю, каков ваш фактический макет, поэтому я просто укажу вам на учебник Swing по телефону Layout Managers для получения дополнительной информации и рабочих примеров.

Полосы прокрутки появятся автоматически, когда предпочтительный размер компонента, добавленного в область просмотра прокрутки, больше, чем размер прокрутки. Менеджер компоновки отвечает за определение предпочтительного размера. Поскольку вы используете нулевой макет, предпочтительный размер (0, 0), поэтому нет никаких причин отображать полосу прокрутки.

+0

Я редактировал код. Кажется, что не работает. –

+2

@RekijanKileren, код, который вы отправили: 1) не реализует мое предложение. 2) не является SSCCE. Мы не можем выполнить ваш код, потому что у нас нет доступа к вашему классу «newPlayerCharacter». И мы не хотим доступа к вашему классу, потому что этот класс не имеет отношения к вашему вопросу. Вы спрашиваете о добавлении компонента в панель в scrollpane. Поэтому добавьте JLabel. 'Держите код простым !!!'. Пока вы не опубликуете надлежащий SSCCE, я не могу помочь. – camickr

+0

Я редактировал оригинальное сообщение снова. Надеюсь, это обеспечит лучшее понимание. Спасибо, что присоединились ко мне :) –

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