2012-06-17 3 views
3

Я делаю приложение, чтобы выступать в качестве хаба своего рода, где пользователь может хранить ярлыки в своих любимых приложениях и легко запускать их. Однако у меня проблемы с FlowLayout. Когда я использую GridLayout, компоненты прекрасно отображаются. Когда я использую FlowLayout, ничего не отображается.FlowLayout не отображает компоненты в то время как GridLayout делает?

GridLayout: GridLayout

FlowLayout: FlowLayout

Все, что я изменил это LayoutManager. Когда я называю getComponentCount, они оба отвечают 9.

Я думал, что это сообщение было довольно долго, так что я положил фрагмент из моей code на код Tidy (от Pastebin)

Заранее спасибо за вашу помощь!

+0

Когда вы написали 'return new Dimension (getWidth(), getHeight());', чьи 'Width' и' Height' учитываются? Если это сам 'JComponent', то если вы расширяете' JComponent/JPanel', то для большинства макетов его размер равен (0, 0). Следовательно, вы должны указать конкретное измерение (некоторое ненулевое значение), чтобы компонент появился. –

ответ

6

1) FlowLayout довольно принимая PreferredSize, которые пришли из JComponent, каждый из JComponents может иметь разные Dimension на экране

пример (uncomnent getMinimumSize & getMinimumSize)

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

public class CustomComponent extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public CustomComponent() { 
     setTitle("Custom Component Test/BorderLayout"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 
    } 

    public void display() { 
     add(new CustomComponents0(), BorderLayout.NORTH); 
     add(new CustomComponents0(), BorderLayout.CENTER); 
     add(new CustomComponents0(), BorderLayout.SOUTH); 
     add(new CustomComponents0(), BorderLayout.EAST); 
     pack(); 
     // enforces the minimum size of both frame and component 
     setMinimumSize(getMinimumSize()); 
     setPreferredSize(getPreferredSize()); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       CustomComponent main = new CustomComponent(); 
       main.display(); 
      } 
     }; 
     javax.swing.SwingUtilities.invokeLater(r); 
    } 
} 

class CustomComponents0 extends JLabel { 

    private static final long serialVersionUID = 1L; 

    /*@Override 
    public Dimension getMinimumSize() { 
    return new Dimension(200, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
    return new Dimension(300, 200); 
    }*/ 
    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 

2) GridLayou т создать пропорциональный площадь за каждые JComponents, а затем только JComponent, которые приобрели Dimnesion, произошли с PreferredSize

3) для GridLayout Я говорю о методе pack(), нет, если есть JFrame#setSize(), для FLowLayout не имеет значения,

+0

Я ноб, но при тестировании кода IDE не может скомпилировать его из-за 'CustomComponents0'. Я делаю что-то неправильно? – DarkLite1

3

Ммм Я знаю, это был дан ответ, но только добавить, если вы смотрите Приведенный ниже код и запустить его, это создаст 9 этикеток и 4 кнопки и добавить их с помощью макета потока, но, как в этом примере ниже кадры размера устанавливается с помощью setSize(int width,int height)

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class FlowLayoutTest extends JFrame { 

    private JPanel NorthPanel, SouthPanel; 
    private JLabel[] labels; 
    private JButton[] buttons; 

    public FlowLayoutTest() { 
     createAndShowUI(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       FlowLayoutTest flowLayoutTest = new FlowLayoutTest(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     setTitle("Flow layout"); 
     setSize(400, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     initializeComponents(); 
     addComponents(this.getContentPane()); 

     //pack(); 

     setVisible(true); 
    } 

    private void initializeComponents() { 

     labels = new JLabel[9]; 
     for (int i = 0; i < labels.length; i++) { 
      labels[i] = new JLabel("Label " + (i+1)); 
     } 
     buttons = new JButton[4]; 
     for (int i = 0; i < buttons.length; i++) { 
      buttons[i] = new JButton("Button " + (i+1)); 
     } 

     NorthPanel = new JPanel(new FlowLayout(5)); 
     SouthPanel = new JPanel(new FlowLayout(5)); 
    } 

    private void addComponents(Container contentPane) { 

     for (int i = 0; i < buttons.length; i++) { 
      SouthPanel.add(buttons[i]); 
     } 

     for (int i = 0; i < labels.length; i++) { 
      NorthPanel.add(labels[i]); 
     } 

     contentPane.add(NorthPanel, BorderLayout.NORTH); 
     contentPane.add(SouthPanel, BorderLayout.SOUTH); 
    } 
} 

однако при запуске приложения вы заметите, что ярлык (номер 9) вышел из экрана , это потому, что был использован setSize(), однако если мы позвоним (или в этом случае раскомментируем) pack(), прежде чем устанавливать рамку на видимую, вы также сможете увидеть все компоненты на фрейме.

+1

+1 ставка никогда не возвращает setSize(), но PreferredSize(), потому что часть Custom LayoutManagers может сжиматься Dimmension неправильным образом – mKorbel

+0

Хммм никогда не думал об этом так, а? +1. Ежедневно изучать новый материал –

+0

Можно ли также обернуть этикетки, которые не подходят для следующей строки? – DarkLite1

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