Word Wrap in JButtons

Can I automate word wrap in JButtons? I have several dynamic buttons that I create at runtime. I want to put the word wrap function on buttons so that I can better test the test buttons. Is it possible to do this?

+11
java swing jbutton
Apr 23 2018-11-18T00:
source share
4 answers

This example uses the built-in CSS rendering capabilities to "heavy lift" the definition of when to break lines. It uses JLabel , but the same principles apply to any component that will render HTML.

FixedWidthText.java

 import javax.swing.*; class FixedWidthText { public static void showLabel(int width, String units) { String content1 = "<html>" + "<body style='background-color: white; width: "; String content2 = "'>" + "<h1>Fixed Width</h1>" + "<p>Body width fixed at "; String content3 = " using CSS. " + "Java HTML" + " support includes support" + " for basic CSS.</p>"; 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, "%"); } } 

Screen shots

160px

enter image description here

200px

enter image description here

fifty%

enter image description here

+23
Apr 24 2018-11-11T00:
source share

Use HTML ...

 button.setText("<html><center>"+"This is a"+"<br>"+"swing button"+"</center></html>"); 
+9
Apr 23 2018-11-18T00:
source share

The simplest thing is to change another component that supports word wrap so that it acts like a button. I made a simple class that manipulates JTextArea to act like a 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 is just an enumeration with the constants NORMAL, HOVERED, CLICKED

Most of the code is only used to make JTextArea look like JButton, and it works very well. One of the drawbacks is that you lose the ability to change it using ButtonModels, but for most applications this will be enough.

0
Jan 19 '17 at 20:36
source share
 @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("<html><center>"); int previousIndex = 0; while (measurer.getPosition() < itemName.length()) { if (previousIndex != 0) stringBuilder.append("<br>"); stringBuilder.append(itemName.substring(previousIndex, measurer.getPosition())); previousIndex = measurer.getPosition(); measurer.nextLayout(wrappingWidth); } if (previousIndex < itemName.length()) { if (previousIndex != 0) stringBuilder.append("<br>"); stringBuilder.append(itemName.substring(previousIndex)); } stringBuilder.append("</center></html>"); setText(stringBuilder.toString()); } 
-3
Jan 17 '16 at 21:03
source share



All Articles