2013-04-28 4 views
3

Как выровнять кнопки (S, S, D & D и A, U, D & d) до середины панелей (синий и красный)? Панели могут расти (высота не ширина), но кнопки должны оставаться посередине и сохранять одинаковые размеры. Так что GridLayout отсутствует.Центральное выравнивание кнопок в JPanel



    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JTable; 

    import java.awt.Dimension; 
    import java.awt.FlowLayout; 
    import java.awt.GridLayout; 

    import javax.swing.JButton; 
    import java.awt.BorderLayout; 
    import java.awt.Color; 


    public class TestFrame extends JFrame { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 5671798241966272024L; 

     public TestFrame() { 

      FlowLayout layout = new FlowLayout(); 

      JButton moveUpButton = new JButton("U"); 
      JButton moveAllUpButton = new JButton("A"); 

      JButton moveDownButton = new JButton("D"); 
      JButton moveAllDownButton = new JButton("D"); 

      JButton selectButton = new JButton("S"); 
      JButton selectAllButton = new JButton("S"); 

      JButton deselectButton = new JButton("D"); 
      JButton deselectAllButton = new JButton("D"); 


      setSize(600, 400); 

      getContentPane().setLayout(new GridLayout()); 


      JPanel selectButtonsPanel = new JPanel(); 
      selectButtonsPanel.setBackground(Color.BLUE); 

      selectButtonsPanel.setLayout(layout); 
      selectButtonsPanel.setPreferredSize(new Dimension(50, 0)); 
      selectButtonsPanel.add(selectAllButton); 
      selectButtonsPanel.add(selectButton); 
      selectButtonsPanel.add(deselectButton); 
      selectButtonsPanel.add(deselectAllButton); 

      JPanel moveButtonsPanel = new JPanel(layout); 
      moveButtonsPanel.setBackground(Color.RED); 
      moveButtonsPanel.setLayout(layout); 
      moveButtonsPanel.setPreferredSize(new Dimension(50, 0)); 
      moveButtonsPanel.add(moveAllUpButton); 
      moveButtonsPanel.add(moveUpButton); 
      moveButtonsPanel.add(moveDownButton); 
      moveButtonsPanel.add(moveAllDownButton); 


      JPanel sourcePanel = new JPanel(); 
      sourcePanel.setLayout(new BorderLayout()); 
      sourcePanel.add(new JTable(), BorderLayout.CENTER); 
      sourcePanel.add(selectButtonsPanel, BorderLayout.EAST); 


      JPanel destinationPanel = new JPanel(); 
      destinationPanel.setLayout(new BorderLayout()); 
      destinationPanel.add(new JTable(), BorderLayout.CENTER); 
      destinationPanel.add(moveButtonsPanel, BorderLayout.EAST); 


      getContentPane().add (sourcePanel); 
      getContentPane().add(destinationPanel); 


     } 

    } 

+0

Что не так с текущим кодом? –

+0

Кнопки выровнены сверху. – 2013-04-28 21:12:55

ответ

4

Рассмотрите возможность вложения JPanels с использованием собственного макета. BoxLayout может позволить вам центрировать ваш внутренний JPanel, который содержит JButtons. Внутренняя панель использует GridLayout и BoxLayout используя внешний JPanel имеет клей добавляется в верхней и нижней части:

JPanel innerSelectPanel = new JPanel(new GridLayout(0, 1, 0, 5)); 
    // innerSelectPanel.setPreferredSize(new Dimension(50, 0)); 
    innerSelectPanel.add(selectAllButton); 
    innerSelectPanel.add(selectButton); 
    innerSelectPanel.add(deselectButton); 
    innerSelectPanel.add(deselectAllButton); 
    innerSelectPanel.setOpaque(false); 
    innerSelectPanel.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2)); 
    selectButtonsPanel.setLayout(new BoxLayout(selectButtonsPanel, BoxLayout.PAGE_AXIS)); 
    selectButtonsPanel.add(Box.createVerticalGlue()); 
    selectButtonsPanel.add(innerSelectPanel); 
    selectButtonsPanel.add(Box.createVerticalGlue()); 

Например:

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

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class TestFrame2 extends JPanel { 
    public static final String[] COLS = { "One", "Two", "Three" }; 
    public static final String[][] BTN_LABELS = { { "S", "S", "D", "D" }, 
     { "A", "U", "D", "D" } }; 

    public TestFrame2() { 
     setLayout(new GridLayout(1, 0)); 
     for (int i = 0; i < 2; i++) { 
     add(createPanel(i)); 
     } 
    } 

    private JPanel createPanel(int row) { 
     int gap = 3; 
     JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, gap)); 
     btnPanel.setBorder(BorderFactory.createEmptyBorder(0, gap, 0, gap)); 
     btnPanel.setOpaque(false); 
     for (int i = 0; i < BTN_LABELS[row].length; i++) { 
     JButton btn = new JButton(BTN_LABELS[row][i]); 
     btnPanel.add(btn); 
     } 
     btnPanel.setMaximumSize(btnPanel.getPreferredSize()); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.setBackground(Color.red); 
     rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS)); 
     rightPanel.add(Box.createVerticalGlue()); 
     rightPanel.add(btnPanel); 
     rightPanel.add(Box.createVerticalGlue()); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(new JScrollPane(new JTable(new DefaultTableModel(COLS, 5))), 
      BorderLayout.CENTER); 
     panel.add(rightPanel, BorderLayout.LINE_END); 
     return panel; 
    } 

    private static void createAndShowGui() { 
     TestFrame2 mainPanel = new TestFrame2(); 

     JFrame frame = new JFrame("TestFrame2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

Это выглядит великолепно. Спасибо – 2013-04-28 21:37:54

+0

@ user2199160: добро пожаловать –

+0

Отличный пример. Мне просто нужно начать использовать их для вложенных панелей. Я начинаю думать, что Swing - это, безусловно, лучший графический интерфейс (очень динамичный), чем остальные. – 2013-04-29 10:57:30

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