无法设置文本标签,因为它与parseDouble相矛盾

时间:2014-04-14 23:28:14

标签: java swing parsing

我有一个如下所示的ItemListener:

private class Listener implements ItemListener
{
    public void itemStateChanged(ItemEvent e)
    {
        calculate();
    }
}

在我的calculate()方法的底部,我设置了这样的标签:

subtotalLbl.setText("\t\t\t\t\t\t\t\tSubtotal:\t\t\t\t\t\t\t\t\t " + String.valueOf(determinedSubTotal + priceIncrease) + "\t\t\t\t\t\t\t\t\t");
taxLbl.setText("\t\t\t\t\t\t\t\tTax:\t\t\t\t\t\t\t\t\t " + String.valueOf(determinedTax + priceIncrease) + "\t\t\t\t\t\t\t\t\t");
totalLbl.setText("\t\t\t\t\t\t\tTotal:\t\t\t\t\t\t\t\t\t " + String.valueOf(determinedTotal + priceIncrease) + "\t\t\t\t\t\t\t\t\t");

然后我有一个ActionListener,它使用来自totalLbl的文本用于parseDouble

private class BtnClicked implements ActionListener
{       
    public void actionPerformed(ActionEvent e)
    {
        String input = totalLbl.getText().trim();
        Double parsedString = Double.parseDouble(input) * 0.20; 

        Object src = e.getSource();

        if(src == submit)
        {
            JOptionPane.showMessageDialog(null,"Thank you for your order - the tip will be " + fmt.format(parsedString), "Thank you" , JOptionPane.INFORMATION_MESSAGE);
        }
        else if(src == cancel)
        {
            JOptionPane.showMessageDialog(null,"Order was canceled" ,"Order Canceled" , JOptionPane.INFORMATION_MESSAGE);
        }
    }

显然,该程序在BtnClicked actionPerformed所在的parseDouble(input)方法的内线崩溃,因为totalLbl JLabel有“总计:“在它......我还能在哪里设置这个或者我将如何解决这个问题? “总计:”是必需的。 (不能使用split()

以下是整个JFrame的截图,点击提交按钮时程序崩溃:

4 个答案:

答案 0 :(得分:3)

创建两个JLable,其中一个Total:表示实际拥有总值的另一个totalLblText.setText("Total:"); totalLbl.setText(String.valueOf(determinedTotal + priceIncrease));

所以你的总计算看起来更像......

\t

然后你不需要照顾。

您应该更好地利用布局管理器以支持您尝试实现的格式化,而不是使用import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestLayout { public static void main(String[] args) { new TestLayout(); } public TestLayout() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JTextField numberOfPizzas; private JCheckBox pepperoni; private JCheckBox sausage; private JCheckBox peppers; private JCheckBox onions; private JCheckBox mushrooms; private JCheckBox extracheese; private JLabel lblSubTotal; private JLabel lblTax; private JLabel lblTotal; public TestPane() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; JPanel header = new JPanel(); JPanel extras = new JPanel(new GridBagLayout()); JPanel totals = new JPanel(new GridBagLayout()); add(header, gbc); gbc.gridy++; add(extras, gbc); gbc.gridy++; add(totals, gbc); numberOfPizzas = new JTextField(5); header.add(new JLabel("Number of pizzas")); header.add(numberOfPizzas); gbc = new GridBagConstraints(); pepperoni = new JCheckBox("Pepperoni"); sausage = new JCheckBox("Sausage"); peppers = new JCheckBox("Peppers"); onions = new JCheckBox("Onions"); mushrooms = new JCheckBox("mushrooms"); extracheese = new JCheckBox("Extra Cheeses"); JCheckBox left[] = new JCheckBox[] {pepperoni, peppers, mushrooms}; JCheckBox right[] = new JCheckBox[] {sausage, onions, extracheese}; gbc.anchor = GridBagConstraints.WEST; gbc.gridx = 0; gbc.gridy = 0; add(left, extras, 0, 1, gbc); gbc.gridx = 1; gbc.gridy = 0; add(right, extras, 0, 1, gbc); gbc = new GridBagConstraints(); gbc.weightx = 1; gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.EAST; gbc.insets = new Insets(2, 12, 2, 12); totals.add(new JLabel("Subtotal:"), gbc); gbc.gridy++; totals.add(new JLabel("Tax:"), gbc); gbc.gridy++; totals.add(new JLabel("Total:"), gbc); gbc.weightx = 0; gbc.gridx = 1; gbc.gridy = 0; lblSubTotal = new JLabel("8.0"); lblTax = new JLabel("0.78"); lblTotal = new JLabel("8.78"); totals.add(lblSubTotal, gbc); gbc.gridy++; totals.add(lblTax, gbc); gbc.gridy++; totals.add(lblTotal, gbc); } protected void add(JComponent[] comps, JComponent parent, int deltaX, int deltaY, GridBagConstraints gbc) { for (JComponent comp : comps) { parent.add(comp, gbc); gbc.gridy += deltaY; gbc.gridx += deltaX; } } } } 这样的格式化字符,这些将始终一团糟

更新了布局示例

这个简单的例子演示了如何使用布局管理器(以及一种称为复合布局的技术),并且无需尝试使用单个标签来显示更多信息,然后它应该......

Layout Example

{{1}}

答案 1 :(得分:1)

许多不同的方法,最简单的可能是:

String[] parts = totalLbl.getText().split(":");
String input = parts[1].trim();
Double parsedString = Double.parseDouble(input) * 0.20; 

答案 2 :(得分:1)

你可以这样做

str = str.replaceAll("\\D+","");

这将删除字符串中的非数字 所以你希望它像这样

 Double parsedString = Double.parseDouble(input.replaceAll("\\D+","")*0.20);

答案 3 :(得分:0)

您可以为标签和值使用单独的小部件。例如。总标签,创建一个JLabel对象并使用静态值" Total:"设置文本,然后为总值创建一个JTextField对象并使用实际值设置文本。提交时,从文本字段而不是标签中获取值。不要忘记将setEditable(false)调用到文本字段,因为文本字段仅用于显示值,而不是接受输入。