2014-01-10 5 views
0

У меня есть JPanel, использующий по умолчанию диспетчер FlowLayout. Мне нравится преимущество стиля документа FlowLayout, в котором я добавляю компоненты по одному с автоматической упаковкой, но хотел бы, чтобы компонент принудительно выбирал новую строку.JPanel FlowLayout Force Component Wrap

Я прочитал, если использовал BoxLayout Я мог бы вставить своего рода component return key и заставить компоненты запускаться на новой строке. Мне нужно руководствоваться моим решением, и это лучший подход.

У меня есть JLabel и JTextField на одной линии, и хотели бы разместить JTextArea обернутый внутри JScrollPane ниже.

ответ

2
  • Используйте комбинацию FlowLayoutиBorderLayout. Это хорошая идея, чтобы развернуть макеты, чтобы получить желаемый результат.
  • JLabel и JTextField бы в одном JPanel с FlowLayout
  • Потом еще JPanel с BorderLayout проведет предыдущую панель в NORTH положении, и JTextArea с JScrollPane в CENTER положении.

    JPanel topPanel = new JPanel(); 
    JLabel label = new JLabel("Text Field Label"); 
    JTextField jtf = new JTextField(20); 
    topPanel.add(label); 
    topPanel.add(jtf); 
    
    JPanel bothPanel = new JPanel(new BorderLayout()); 
    JTextArea jta = new JTextArea(20, 40); 
    bothPanel.add(topPanel, BorderLayout.NORTH); 
    bothPanel.add(new JScrollPane(jta)); 
    

Посмотрите Laying Out Components Within a Container

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FlowBorderDemo { 

    public FlowBorderDemo() { 
     JPanel topPanel = new JPanel(); 
     JLabel label = new JLabel("Text Field Label"); 
     label.setForeground(Color.white); 
     JTextField jtf = new JTextField(20); 
     topPanel.add(label); 
     topPanel.add(jtf); 
     topPanel.setBackground(Color.black); 


     JPanel bothPanel = new JPanel(new BorderLayout()); 
     JTextArea jta = new JTextArea(20, 40); 
     JScrollPane scrollPane = new JScrollPane(jta); 
     scrollPane.setBorder(BorderFactory.createMatteBorder(3, 0, 0, 0, Color.GRAY)); 
     bothPanel.add(topPanel, BorderLayout.NORTH); 
     bothPanel.add(scrollPane); 
     bothPanel.setBorder(BorderFactory.createMatteBorder(3, 8, 3, 8, Color.GRAY)); 

     JLabel copyLabel = new JLabel("<html>&copy;2014 peeskillet</html>"); 
     copyLabel.setBackground(Color.LIGHT_GRAY); 
     copyLabel.setHorizontalAlignment(JLabel.CENTER); 
     bothPanel.add(copyLabel, BorderLayout.PAGE_END); 


     JFrame frame = new JFrame(); 
     frame.add(bothPanel); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager 
          .getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException 
         | IllegalAccessException 
         | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       new FlowBorderDemo(); 
      } 
     }); 
    } 
} 
+0

Спасибо @peeskillet. Я никогда не рассматривал просто умножение количества панелей и игру с менеджерами макетов. Однако как бы принудительно обернуть компонент в один и тот же менеджер компоновки? – Mushy

+0

@ Mushy, что именно вы пытаетесь _wrap_? –

+0

Я хочу остаться в 'FlowLayout' и обернуть' JScrollPane' под 'JLabel' и' JTextField', не играя с дополнительными панелями и менеджерами макетов. – Mushy