2015-01-02 3 views
0

Я учусь качели графический интерфейс, и я получаю этот результат, когда я использую следующий код: -Как контролировать размер панелей

What I get

код я использую: -

private void initUI() { 
     JTextArea visualize=new JTextArea(); 
     visualize.setEditable(false); 

     //DEFINE BUTTONS.... 

     JButton[] buttons1={addition,subtraction,division,multiplication}; 
     JButton [] buttons2={expr,date,conversion}; 

     JPanel numerical=new JPanel(new FlowLayout()); 
     numerical.setPreferredSize(new Dimension(350, 50)); 
     for(int i=0;i<buttons1.length;i++){ 
      numerical.add(buttons1[i]); 
     } 
     numerical.setBorder(new TitledBorder("Numerical Operations")); 

     JPanel nonnum=new JPanel(new FlowLayout()); 
     nonnum.setPreferredSize(new Dimension(500, 50)); 
     for(int i=0;i<buttons2.length;i++){ 
      nonnum.add(buttons2[i]); 
     } 
     nonnum.setBorder(new TitledBorder("Non-numerical Operations")); 

     JPanel operations = new JPanel(new BorderLayout(2,2)); 
     operations.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     operations.setSize(800, 100); 
     operations.add(numerical,BorderLayout.WEST); 
     operations.add(nonnum,BorderLayout.EAST); 

     JTable sheet = new JTable(10,5); 



     add(visualize, BorderLayout.NORTH); 
     add(sheet,BorderLayout.SOUTH); 
     add(operations,BorderLayout.CENTER); 
     pack(); 
     setSize(1000, 700); 
     setTitle("Spreadsheet Application"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
    } 

Но что я действительно хочу это: - What I want

Мои вопросы: -

  1. Почему панель операций слишком длинная?
  2. Как я могу изменить его высоту?
  3. Не работает «operation.setSize (..)»?
+0

См [Должен ли я избежать использования набора (Preferred | Максимум | Минимум) методы Размер в Java Swing?] (HTTP: //stackoverflow.com/q/7229226/418556) (Да.) –

ответ

2

Попробуйте использовать GroupLayout. Я также новый графический интерфейс качаться и имели схожие проблемы - GroupLayout спас

JPanel complete=new JPanel(); 
    GroupLayout gl=new GroupLayout(complete); 
    complete.setLayout(gl); 
    gl.setAutoCreateContainerGaps(true); 

    gl.setHorizontalGroup(gl.createParallelGroup() //this is parallel bcz you need components vertically 
      .addComponent(visualize)  //you MUST add components to both horizontal and vertical groups 
      .addComponent(operations) 
      .addComponent(sheet) 
    ); 

    gl.setVerticalGroup(gl.createSequentialGroup() //NOTE that this is sequential 
      .addComponent(visualize) 
      .addComponent(operations) 
      .addGap(50)  //you can add gaps if you want 
      .addComponent(sheet) 
    ); 

    add(complete); 
1

Так как это работает BorderLayout, более подробно рассмотрите How to Use BorderLayout. Положение CENTRE будет занимать все оставшееся пространство кадра, где позиции NORTH и SOUTH будут пытаться соблюдать достоинства компонентов.

Вы можете использовать GridBagLayout, что позволит вам больше контролировать компоновку или использовать ряд составных макетов.

Что-то вроде ...

setLayout(new GridBagLayout()); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.weightx = 1; 
gbc.fill = GridBagConstraints.BOTH; 

add(visualize, gbc); 
add(operations, gbc); 
gbc.gridy = 1; 
add(sheet, gbc); 

Это, как правило, не рекомендуется, чтобы продлить из контейнера верхнего уровня, как JFrame, вместо этого вы должны использовать что-то вроде JPanel определить свои UIs, а затем добавить их в контейнеры, которые вы хотите , Это увеличивает там повторное использование и делает его легче использовать в разных контейнерах

Вы можете также хотели бы взглянуть на How to Use Scroll Panes

1

НЕКОТОРЫЕ нас найти GridBagLayout быть королевской болью, и вы можете не используйте его, чтобы делать то, что вы хотите сделать.

Идея менеджера компоновки заключается в том, чтобы позволить менеджеру макета управлять размером и положением его компонентов, чтобы вам не пришлось с ними работать. MP прав, GridBag позволяет вам много контролировать, но это также означает, что вы должны получить много вещей, чтобы заставить его делать то, что вы хотите.

Итак, альтернатива: сделайте JPanel для хранения панелей visualize и operations; дайте этой новой панели BoxLayout с ориентацией Y_AXIS, затем добавьте их в том порядке, в котором вы хотите, чтобы они отображались сверху вниз.

Затем положить sheet в BorderLayout.CENTER of JFrame. На самом деле, я думаю, вы захотите взять совет MP и пройти учебник по JScrollPane; насколько я помню, вы создаете панель, затем создаете экземпляр JScrollPane с панелью в качестве параметра конструкции, а затем добавляете экземпляр scrollpane в JFrame (в CENTER, в вашем случае).

Будучи в центре, он будет расширяться и сжиматься при изменении размера окна пользователя.

Удачи. Свинг привыкает.

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