2015-08-31 2 views
1

Извините, если это глупый вопрос, я очень новичок в Java Swing UI. Я пытаюсь разработать программу, которая захватит мои достижения Steam, и у меня есть базовый код для этого, но теперь я хочу создать для него интерфейс.Java Swing JScrollPane Содержит больше Panes, а не прокрутку?

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

Проблема в том, что моя scrollPanel (внутри mainPanel), похоже, не прокручивается (у нее нет полос прокрутки сбоку, а колесо прокрутки ничего не делает). Я бы предположил, что прокрутка будет содержать содержимое scrollPanel (которое является панелью, имеет список всех достижений, сохраненных на Карте).

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

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.WindowEvent; 
import java.util.Iterator; 
import java.util.Map; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class UserInterface extends JFrame { 

public UserInterface() { 
    initUI(); 
} 

@SuppressWarnings("unchecked") 
private void initUI() { 

    UserInteractionHandler uiHandler = new UserInteractionHandler(); 

    setTitle("Steam Stats"); 
    setSize(500, 400); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

    JPanel panel = new JPanel(new GridLayout(0, 1)); 

    JLabel header = new JLabel("Steam Stats", SwingConstants.CENTER); 
    header.setFont(new Font("trebuchet ms", Font.BOLD, 20)); 
    panel.add(header); 


    String userId = JOptionPane.showInputDialog("Steam ID 64"); 
    String appId = JOptionPane.showInputDialog("App Id of Game"); 

    Map<String, Integer> allAchievements = uiHandler.getAllAchievements(appId, userId); 

    @SuppressWarnings("rawtypes") 
    Iterator it = allAchievements.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>) it.next(); 

     JLabel key = new JLabel(pair.getKey()); 
     JLabel value = new JLabel(pair.getValue().toString()); 
     panel.add(key); 
     panel.add(value); 

     it.remove(); 
    } 

    JScrollPane scrollPanel = new JScrollPane(panel); 

    JPanel mainPanel = new JPanel(new GridLayout(0, 1)); 
    mainPanel.add(scrollPanel); 

    getContentPane().add(mainPanel, BorderLayout.NORTH); 



} 

public static void runUi() { 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      UserInterface ui = new UserInterface(); 
      ui.setVisible(true); 
     } 
    }); 
} 
} 

Вот скриншот окна это производит: http://puu.sh/jVsto/4a4bcbdf6e.png

Спасибо за любую помощь. Mat

ответ

3

Ваша проблема заключается в том, что вы добавляете JScrollPane BorderLayout.NORTH и устанавливаете размер графического интерфейса. Это будет ограничивать GUI до определенного размера, но не ограничивает размер компонента BorderLayout.NORTH, и поэтому он будет настолько большим, насколько это необходимо, чтобы отображать все содержимое окна просмотра JScrollPane независимо от того, что он находится в небольшом графическом интерфейсе.

Возможные решения:

  • Если вы добавили JScrollPane в положение BorderLayout.CENTER, это реально работает.
  • Вы хотите, чтобы избежать установки размеров чего-либо, если это возможно.
  • Вы можете ограничить PreferredSize в иллюминаторе JScrollPane в
  • Моего любимым решения: использовать JList в JScrollPane для отображения данных, а также указать подсчитывать видимую строку в списке с помощью setVisibleRowCount(...).

Например:

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.WindowEvent; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class UserInterface extends JFrame { 

    public UserInterface() { 
     initUI(); 
    } 

    @SuppressWarnings("unchecked") 
    private void initUI() { 

     UserInteractionHandler uiHandler = new UserInteractionHandler(); 

     setTitle("Steam Stats"); 
     // !! setSize(500, 400); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

     JPanel panel = new JPanel(new GridLayout(0, 1)); 

     JLabel header = new JLabel("Steam Stats", SwingConstants.CENTER); 
     header.setFont(new Font("trebuchet ms", Font.BOLD, 20)); 
     panel.add(header); 

     String userId = JOptionPane.showInputDialog("Steam ID 64"); 
     String appId = JOptionPane.showInputDialog("App Id of Game"); 

     Map<String, Integer> allAchievements = uiHandler.getAllAchievements(
       appId, userId); 

     DefaultListModel<MyPair> listModel = new DefaultListModel<>(); 
     JList<MyPair> pairList = new JList<>(listModel); 
     pairList.setCellRenderer(new MyPairRenderer()); 
     pairList.setVisibleRowCount(20); 

     @SuppressWarnings("rawtypes") 
     Iterator it = allAchievements.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>) it 
        .next(); 

      MyPair myPair = new MyPair(pair.getKey(), pair.getValue()); 
      listModel.addElement(myPair); 

      it.remove(); 
     } 

     //!! JScrollPane scrollPanel = new JScrollPane(panel); 
     JScrollPane scrollPanel = new JScrollPane(pairList); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     mainPanel.add(header, BorderLayout.PAGE_START); 
     mainPanel.add(scrollPanel); 

     getContentPane().add(mainPanel, BorderLayout.PAGE_START); 
     pack(); // !! 

    } 

    public static void runUi() { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       UserInterface ui = new UserInterface(); 
       ui.setVisible(true); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     UserInterface.runUi(); 
    } 
} 

class MyPair { 
    private String name; 
    private int value; 
    public MyPair(String name, int value) { 
     this.name = name; 
     this.value = value; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getValue() { 
     return value; 
    } 

} 

class MyPairRenderer implements ListCellRenderer<MyPair> { 
    private JPanel panel = new JPanel(new GridLayout(1, 2, 5, 5)); 
    private JLabel nameLabel = new JLabel(); 
    private JLabel valueLabel = new JLabel(); 

    public MyPairRenderer() { 
     panel.add(nameLabel); 
     panel.add(valueLabel); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList<? extends MyPair> list, 
      MyPair value, int index, boolean isSelected, boolean cellHasFocus) { 
     if (value != null) { 
      nameLabel.setText(value.getName()); 
      valueLabel.setText("" + value.getValue()); 
     } 
     return panel; 
    } 

} 
+0

Это работает блестяще, спасибо! –

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