制作Java SplitButton

时间:2015-07-28 14:39:47

标签: java swing layout jbutton containers

以下代码似乎应该使用两个关联的JButton均匀地填充给定空间,而是用一个按钮填充FlowLayout的整个顶行 - 忽略按钮的最大大小 - 并将另一个按钮放在新行上,只是部分可见。如何让按钮均匀地填充JPanel?

Get-ChildItem | Where-Object { -not $_.PSIsContainer }

1 个答案:

答案 0 :(得分:1)

经过一段时间的努力,我尝试了一个GridLayout - 这使得Swing中的SplitButtons成为一个非常合理的UI元素。

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);
    }
}