2015-07-28 3 views
1

Следующий код кажется, что он должен заполнять заданное пространство равномерно двумя связанными JButtons, но вместо этого он заполняет всю верхнюю строку FlowLayout одной кнопкой - игнорируя максимальный размер кнопки - и помещает другую кнопку в новой строке, только частично видимой. Как я могу получить кнопки для равномерного заполнения JPanel бок о бок?Создание Java SplitButton

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

public class SplitButton extends JPanel { 

    // The other half. 
    private JButton button2; 
    private JButton button3; 

    public SplitButton(String left, String right, int width, int height) { 
     super(); 
     //setBackground(Color.GREEN); 
     //setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
     setMinimumSize(new Dimension(width, height)); 
     FlowLayout flow = new FlowLayout(); 
     flow.setAlignment(FlowLayout.LEFT); 
     flow.setHgap(0); 
     flow.setVgap(0); 

     setLayout(flow); 

     button2 = new JButton(right); 
     button2.setMinimumSize(new Dimension(width/2, height)); 
     button2.setMaximumSize(new Dimension(width/2, height)); 
     button2.setPreferredSize(new Dimension(width/2, height)); 
     add(button2); 

     button3 = new JButton(right); 
     button3.setMinimumSize(new Dimension(width/2, height)); 
     button2.setMaximumSize(new Dimension(width/2, height)); 
     button2.setPreferredSize(new Dimension(width/2, height)); 
     add(button3); 
    } 
} 
+1

Используйте [GridLayout] (https://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html). 'FlowLayout' не предназначен для равномерного заполнения доступного пространства, либо используйте' GridLayout', либо используйте [GridBagLayout] (https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html) –

+0

Спасибо! Да, я попробовал GridLayout, как через 10 минут после того, как задал вопрос. Это также устраняет необходимость установки размеров. –

+0

Ха-ха, на самом деле, если вы используете соответствующий макет для данного прецедента, никогда не нужно использовать какие-либо методы 'setXxXSize (...)', поскольку это относится к проблеме 'Layout Manager'. Для остальных, ВЫ МОЖЕТЕ ПРИВЕТСТВУЕТЕ И ХРАНИЛИ СМОТРЕТЬ :-) –

ответ

1

Через некоторое время изо всех сил, я попробовал GridLayout - что делает SplitButtons в свинг очень рациональный элемент пользовательского интерфейса.

import java.awt.Font; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionListener; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class SplitButton extends JPanel { 

    // The buttons. 
    private JButton[] buttons; 

    // Self-explanatory. 
    public Color prim, trim; 
    public Font font; 

    public SplitButton(String[] labels, Color prim, Color trim, Font font) { 
     super(); 

     this.prim = prim; 
     this.trim = trim; 
     this.font = font; 

     // Evenly lays out buttons evenly in a row. 
     GridLayout grid = new GridLayout(1, labels.length); 
     grid.setHgap(0); 
     grid.setVgap(0); 
     setLayout(grid); 

     setOpaque(false); 
     initButtons(labels); 
    } 

    /** 
    * Constructs and styles the button array. 
    * @param labels The button labels. 
    */ 
    private void initButtons(String[] labels) { 
     buttons = new JButton[labels.length]; 
     for(int i = 0; i < buttons.length; i++) { 
      buttons[i] = new JButton(labels[i]); 

      // Only outer borders are thick. 
      int lb = (i == 0) ? 2 : 1; 
      int rb = (i == buttons.length - 1) ? 2 : 0; 

      buttons[i].setBorder(BorderFactory.createMatteBorder(2, lb, 2, rb, trim)); 
      buttons[i].setFocusPainted(false); 
      buttons[i].setFont(font); 
      buttons[i].setBackground(prim); 
      buttons[i].setForeground(trim); 
      add(buttons[i]); 
     } 
    } 

    /** 
    * Enable/disable the buttons. 
    * @param enabled Is the button enabled? 
    */ 
    public void setEnabled(boolean enabled) { 
     if(buttons != null) 
      for(int i = 0; i < buttons.length; i++) 
       buttons[i].setEnabled(enabled); 
    } 

    /** 
    * Listen to all the buttons. 
    * @param listener The listening object. 
    */ 
    public void addActionListener(ActionListener listener) { 
     if(buttons != null) 
      for(int i = 0; i < buttons.length; i++) 
       buttons[i].addActionListener(listener); 
    } 
} 
Смежные вопросы