2015-03-26 4 views
0

Я пытаюсь сделать это:FlowLayout или BoxLayout? в JAVA

Mokump

, но если я использую GridLayout, то heigth является Bery небольшой

PanelPost.setLayout(new GridLayout(20, 1, 0, 12)); 
for(int y=0;y<15;y++){ 
      JPanel p=new JPanel(); 
      p.setBackground(Color.RED); 
      p.setLayout(null); 
      p.setSize(PanelPost.getWidth(),150); 
      PanelPost.add(p); 

     } 

GridLayout , если я использую FlowLayout, отображает только некоторые моменты С BoxLayout

setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 

панели находятся в центре ter и ширина и высота не соблюдаются , и если я использую setLayout (null), прокрутка не работает, то Каков наилучший способ сделать это? : C

+0

В чем проблема с GridLayout? – immibis

+0

Ваша проблема начинается здесь -> 'p.setLayout (null);'. «GridLayout» будет использовать предпочтительный размер компонентов для определения размеров ячеек, которые он хочет использовать. Это значение определяется диспетчером макета панели ... который вы теперь отбросили ... – MadProgrammer

+0

С GridLayout отображаются только строки, потому что высота не работает, а p.setLayout (null) я использую это, потому что я помещаю некоторые метки и Панель внутри этого. – grijalvaromero

ответ

1

Ваша проблема начинается здесь ->p.setLayout(null);. GridLayout будет использовать предпочтительный размер компонентов для определения размеров ячеек, которые он хочет использовать. Это значение определяется менеджером макета панели ... который вы теперь отбросили ...

Избегайте использования макетов null, идеальные макеты пикселей - это иллюзия в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Свинг был разработан для работы с менеджерами компоновки в ядре, отбрасывая это не приведет к концу вопросов и проблем, с которыми вы будете тратить все больше и больше времени, пытаясь исправить

Boo

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(new ListOfStuffPane())); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ListOfStuffPane extends JPanel implements Scrollable { 

     public ListOfStuffPane() { 
      setLayout(new GridLayout(20, 1, 0, 12)); 
      for (int y = 0; y < 15; y++) { 
       JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
       p.setBackground(Color.RED); 
       p.add(new JLabel("Boo")); 
       add(p); 
      } 
     } 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return new Dimension(100, 200); 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return true; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 


    } 

} 

См Laying Out Components Within a Container более подробности

+0

: O я удаляю setLayout (null) и работает, но я буду использовать ваш код Спасибо – grijalvaromero

0

Вы можете использовать BoxLayout для решения этой проблемы. Позволь мне объяснить. Прежде всего, давайте рассмотрим ваш сценарий; вы хотите прокручиваемый список, не так ли? с компонентами с фиксированной высотой, но с различной шириной (поскольку вы использовали ширину getWidth() в качестве ширины). Итак, для создания чего-то «прокручиваемого» вам нужна ScrollPane в Java. JScrollPane является предпочтительным прокручиваемым контейнером. Теперь установите этот JScrollPane как базовый контейнер. Теперь создайте новый JPanel-объект с установленным BoxLayout с ориентацией Y_AXIS. Теперь установите этот вновь созданный объект JPanel как окно просмотра контейнера JScrollPane. Итак, здесь мы создали прокручивающийся контейнер.

Следующий шаг - это то, что вы упомянули в своем примере кода, то есть добавление элементов «post». Для этого, как и вы, внутри цикла for создайте каждый объект JPanel. Но вместо использования метода setSize() вы должны использовать метод setPreferredSize (новый размер (w, h)). Это заставляет ваши компоненты отображать в соответствии с указанным размером. Для вставки вертикальных разрывов между каждым объектом сообщения вы можете использовать метод createVerticalStrut (int height) класса . Я даю код ниже. Не стесняйтесь спрашивать, есть ли у вас какие-либо сомнения. :)

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

public class LinkedInLayout extends JFrame{ 
    public LinkedInLayout(){ 
     setTitle("Linked In Layout Resolution"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setBounds(0,0,500,520); 

     JPanel postPane = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
     JScrollPane container = new JScrollPane(postPane,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     setContentPane(container); 

     postPane.setLayout(new BoxLayout(postPane,BoxLayout.Y_AXIS)); 

     for(int y=0;y<15;y++){ 
      postPane.add(Box.createVerticalStrut(35)); 
      JPanel p=new JPanel(); 
      p.setBackground(new Color(247,221,221)); 
      p.setLayout(null); 
      p.setPreferredSize(new Dimension(postPane.getWidth(),75)); 
      postPane.add(p); 
     } 
     setVisible(true); 
    } 
    public static void main(String[] args) { 
     new LinkedInLayout(); 
    } 
} 
+0

Не надо обеспокоен именем Класса. Я просто дал это. – JHermit

+0

И если вы хотите увеличить скорость прокрутки, вы можете попробовать этот container.getHorizontalScrollBar(). SetUnitIncrement (10); container.getVerticalScrollBar(). SetUnitIncrement (10); – JHermit