package org.chartsy.stockscanpro.ui; import java.awt.Color; import java.awt.Container; import java.awt.FontMetrics; import java.awt.Graphics; import java.text.BreakIterator; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SpringLayout; import javax.swing.SwingUtilities; /** * * @author Viorel */ public class ErrorPanel extends JPanel { private String scanTitle = ""; private String scan = ""; private String error = ""; private JLabel scanTitleLbl; private JLabel queryLbl; private JLabel errorLbl; public ErrorPanel (String scanTitle, String scan, String error) { super(new SpringLayout()); setBackground(Color.white); this.scanTitle = scanTitle; this.scan = scan; this.error = "<html>" + error.replace("\n", "<br>") + "</html>"; initComponents(); } private void initComponents() { scanTitleLbl = new JLabel(scanTitle, JLabel.LEFT); add(scanTitleLbl); queryLbl = new JLabel("", JLabel.LEFT); add(queryLbl); errorLbl = new JLabel(error, JLabel.LEFT); errorLbl.setForeground(Color.red); add(errorLbl); SpringUtilities.makeCompactGrid(this, 3, 1, // rows, cols 5, 5, // initialX, initialY 5, 5); // xPad, yPad } protected @Override void paintComponent(Graphics g) { super.paintComponent(g); if (queryLbl.getText().equals("")) wrapedLabel(queryLbl, scan); } private void wrapedLabel(JLabel label, String text) { FontMetrics fm = label.getFontMetrics(label.getFont()); Container container = label.getParent(); int containerWidth = container.getWidth(); BreakIterator boundary = BreakIterator.getWordInstance(); boundary.setText(text); StringBuilder trial = new StringBuilder(); StringBuilder real = new StringBuilder("<html>"); int start = boundary.first(); for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { String word = text.substring(start, end); trial.append(word); int trialWidth = SwingUtilities.computeStringWidth(fm, trial.toString()); if (trialWidth > containerWidth) { trial = new StringBuilder(word); real.append("<br>"); } real.append(word); } real.append("</html>"); label.setText(real.toString()); } }