为了账号安全,请及时绑定邮箱和手机立即绑定

JButton中的自动换行

JButton中的自动换行

暮色呼如 2019-11-20 10:56:03
是否可以在JButtons中实现文本自动自动换行?我在运行时创建了几个动态按钮。我想在按钮上使用自动换行功能,以便可以对按钮进行更好的测试。有可能这样做吗?
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

最简单的方法是修改另一个支持自动换行的Component,以使其充当Button。我做了一个简单的类,它操纵JTextArea充当Button。


 public class MultiLineButton extends JTextArea implements MouseListener    {

    /**

     * 

     */

    private static final long serialVersionUID = 1L;

    private Color defaultColor;

    private Color highlight, lightHighlight;

    private BtnState state;

    private List<ActionListener> actionListeners;


    public MultiLineButton(String text, Color defaultColor) {

        this.setEditable(false);

        this.setText(text);

        this.setLineWrap(true);

        this.setWrapStyleWord(true);

        this.addMouseListener(this);

        this.setBorder(new EmptyBorder(5, 10, 5, 10));

        state = BtnState.NORMAL;

        this.defaultColor = defaultColor;

        this.setBackground(defaultColor);

        highlight = new Color(122, 138, 153);

        lightHighlight = new Color(184, 207, 229);

        // clickedColor = new Color(r, g, b);/

        actionListeners = new ArrayList<>();

    }


    @Override

    public Color getSelectionColor() {

        return getBackground();

    }


    @Override

    public void mouseClicked(MouseEvent e) {

    }


    @Override

    public void mousePressed(MouseEvent e) {

        setBackground(lightHighlight);

        state = BtnState.CLICKED;

        repaint();

    }   


    @Override

    public void mouseReleased(MouseEvent e) {

        for (ActionListener l : actionListeners) {

            l.actionPerformed(new ActionEvent(this,     ActionEvent.ACTION_PERFORMED, this.getText()));

        }

        setBackground(defaultColor);

        state = BtnState.NORMAL;

        repaint();

    }


    @Override

    public void mouseEntered(MouseEvent e) {

        state = BtnState.HOVERED;

        repaint();

    }


    @Override

    public void mouseExited(MouseEvent e) {

        setBackground(defaultColor);

        state = BtnState.NORMAL;

        repaint();

    }


    @Override

    public void paintBorder(Graphics g) {

        super.paintBorder(g);

        Graphics g2 = g.create();

        g2.setColor(highlight);

        switch (state) {

        case NORMAL:

            g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);

            break;

        case HOVERED:

            g2.drawRect(1, 1, getWidth() - 3, getHeight() - 3);

            g2.setColor(lightHighlight);

            g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);

            g2.drawRect(2, 2, getWidth() - 5, getHeight() - 5);

            break;

        case CLICKED:

            Border b = new BevelBorder(BevelBorder.LOWERED);

            b.paintBorder(this, g2, 0, 0, getWidth(), getHeight());

            break;

        }

        g2.dispose();

    }


    public void addActionListener(ActionListener l) {

        actionListeners.add(l);

    }


    public List<ActionListener> getActionListeners() {

        return actionListeners;

    }

}

BtnState只是一个具有常量NORMAL,HOVERED,CLICKED的枚举


大多数代码仅用于使JTextArea看起来像JButton,并且效果很好。缺点之一是您无法通过ButtonModels修改它,但是对于大多数应用程序来说,这就足够了。


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 956 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信