JButtons中的单词换行

是否可以在JButtons中实现文本的自动换行? 我在运行时创建的动态按钮很少。 我想在按钮上放置自动换行function,这样我就可以在按钮上看到更好的测试。 有可能吗?

这个例子使用Java内置的CSS渲染function来完成确定何时进行换行的“繁重工作”。 它使用JLabel ,但相同的原则适用于将呈现HTML的任何组件。

FixedWidthText.java

 import javax.swing.*; class FixedWidthText { public static void showLabel(int width, String units) { String content1 = "" + "" + "

Fixed Width

" + "

Body width fixed at "; String content3 = " using CSS. " + "Java's HTML" + " support includes support" + " for basic CSS.

"; final String content = content1 + width + units + content2 + width + units + content3; Runnable r = new Runnable() { public void run() { JLabel label = new JLabel(content); JOptionPane.showMessageDialog(null, label); } }; SwingUtilities.invokeLater(r); } public static void main(String[] args) { showLabel(160, "px"); showLabel(200, "px"); showLabel(50, "%"); } }

截屏

160像素

在此处输入图像描述

200像素

在此处输入图像描述

50%

在此处输入图像描述

使用HTML …

 button.setText("
"+"This is a"+"
"+"swing button"+"
");

最简单的方法是修改另一个支持自动换行的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 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 getActionListeners() { return actionListeners; } } 

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

大多数代码只是用于使JTextArea看起来像JButton,它工作得很好。 一个缺点是你失去了通过ButtonModels修改它的能力,但对于大多数应用程序来说这已经足够了。

 @Override public void paint(Graphics pGraphics) { super.paint(pGraphics); Graphics2D g2d = (Graphics2D) pGraphics; FontRenderContext frc = g2d.getFontRenderContext(); String itemName = item.getName(); AttributedString attributedString = new AttributedString(itemName); attributedString.addAttribute(TextAttribute.FONT, getFont()); AttributedCharacterIterator iterator = attributedString.getIterator(); LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, frc); float wrappingWidth = getSize().width - 15; StringBuilder stringBuilder = new StringBuilder("
"); int previousIndex = 0; while (measurer.getPosition() < itemName.length()) { if (previousIndex != 0) stringBuilder.append("
"); stringBuilder.append(itemName.substring(previousIndex, measurer.getPosition())); previousIndex = measurer.getPosition(); measurer.nextLayout(wrappingWidth); } if (previousIndex < itemName.length()) { if (previousIndex != 0) stringBuilder.append("
"); stringBuilder.append(itemName.substring(previousIndex)); } stringBuilder.append("
"); setText(stringBuilder.toString()); }