慕的地10843
最简单的方法是修改另一个支持自动换行的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修改它,但是对于大多数应用程序来说,这就足够了。