mogelijk lossy conversie van lang naar int? [DUPLICEER]

Ik heb dit programma dat is vrij veel een rekenmachine, maar met een bewegende JLabel die geacht wordt te kleuren veranderen elke keer dat u op het label, maar ik heb 3 fouten op de bodem van de code die ik met een commentaar hebt gemarkeerd . Alle drie zijn:
error: onverenigbaar types: mogelijk lossy conversie van lang naar int

public class TestCalculator {
private ResultPane resultPane;
public static void main(String[] args) {
    new TestCalculator();
}
public TestCalculator() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                resultPane = new ResultPane();
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }
            JFrame frame = new JFrame("Testing");
            frame.setGlassPane(resultPane);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new CalculatorPane(resultPane));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            frame.setBounds(200,200,500,400);
        }
    });
}
public class ResultPane extends JPanel {
    private JLabel result;
    private Timer timer;
    private int xDelta = (Math.random() > 0.5) ? 1 : -1;
    private int yDelta = (Math.random() > 0.5) ? 1 : -1;
    public void setLabelForeground(Color color) {
        result.setForeground(color);
    }
    public ResultPane() {
        setOpaque(false);
        setLayout(null);
        result = new JLabel();
        Font font = result.getFont();
        font = font.deriveFont(Font.BOLD, 26f);
        result.setFont(font);
        add(result);
        HandlerClass handler = new HandlerClass();
        result.addMouseListener(handler);
        result.addMouseMotionListener(handler);
        timer = new Timer(40, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Point point = result.getLocation();
                point.x += xDelta;
                point.y += yDelta;
                if (point.x < 0) {
                    point.x = 0;
                    xDelta *= -1;
                } else if (point.x + result.getWidth() > getWidth()) {
                    point.x = getWidth() - result.getWidth();
                    xDelta *= -1;
                }
                if (point.y < 0) {
                    point.y = 0;
                    yDelta *= -1;
                } else if (point.y + result.getHeight() > getHeight()) {
                    point.y = getHeight() - result.getHeight();
                    yDelta *= -1;
                }
                result.setLocation(point);
                repaint();
            }
        });
        timer.start();
    }
    public void setResult(Number number) {
        result.setText(NumberFormat.getNumberInstance().format(number));
        result.setSize(result.getPreferredSize());
        setVisible(true);
    }
    public String getResultText() {
        return result.getText();
    }
}
public class CalculatorPane extends JPanel {
    private final ResultPane resultPane;
    private final JLabel firstNumberLabel = new JLabel("First Number:");
    private final JLabel secondNumberLabel = new JLabel("Second Number:");
    private final JTextField firstNumberField = new JTextField(5);
    private final JTextField secondNumberField = new JTextField(5);
    public double result = 0.0;
    public CalculatorPane(ResultPane resultPane) {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        this.resultPane = resultPane;
        JPanel fields = new JPanel();
        fields.add(firstNumberLabel);
        fields.add(firstNumberField);
        fields.add(secondNumberLabel);
        fields.add(secondNumberField);
        add(fields, gbc);
        JPanel buttons = new JPanel();
        buttons.add(new JButton(new AddAction()));
        buttons.add(new JButton(new SubtractAction()));
        buttons.add(new JButton(new MultiplyAction()));
        buttons.add(new JButton(new DivideAction()));
        add(buttons, gbc);
    }
    public class AddAction extends AbstractAction {
        public AddAction() {
            putValue(NAME, "+");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());
                double result = num1 + num2;
                resultPane.setResult(result);
                String resultText = resultPane.getResultText();
            firstNumberField.setText(resultText);
            } catch (NumberFormatException exp) {
            }
        }
    }
    public class SubtractAction extends AbstractAction {
        public SubtractAction() {
            putValue(NAME, "-");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());
                double result = num1 - num2;
                resultPane.setResult(result);
                String resultText = resultPane.getResultText();
            firstNumberField.setText(resultText);
            } catch (NumberFormatException exp) {
            }
        }
    }
    public class MultiplyAction extends AbstractAction {
        public MultiplyAction() {
            putValue(NAME, "x");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());
                double result = num1 * num2;
                resultPane.setResult(result);
                String resultText = resultPane.getResultText();
            firstNumberField.setText(resultText);
            } catch (NumberFormatException exp) {
            }
        }
    }
    public class DivideAction extends AbstractAction {
        public DivideAction() {
            putValue(NAME, "/");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(firstNumberField.getText());
                double num2 = Double.parseDouble(secondNumberField.getText());
                double result = num1 / num2;
                resultPane.setResult(result);
                String resultText = resultPane.getResultText();
                firstNumberField.setText(resultText);
            } catch (NumberFormatException exp) {
            }
        }
    }
}
private class HandlerClass implements MouseListener, MouseMotionListener {
        public void mouseClicked(MouseEvent event) {
        int r = Math.round(Math.random() * 255);//error here
    int g = Math.round(Math.random() * 255);//here
    int b = Math.round(Math.random() * 255);//and here
    Color col = new Color(r, g, b);
        resultPane.setLabelForeground(col);
        }
        public void mouseReleased(MouseEvent event) {
        }
        public void mousePressed(MouseEvent event) {
        }
        public void mouseExited(MouseEvent event) {
        }
        public void mouseEntered(MouseEvent event) {
        }
        public void mouseMoved(MouseEvent event) {
        }
        public void mouseDragged(MouseEvent event){
        }
    }
}

Antwoord 1, Autoriteit 100%

Dat komt omdat een long64 bits is en een intis 32 bits, om nog maar te zwijgen Om van longte gaan naar int, moet u wat informatie weggooien en de compiler kan / niet automatisch niet doen. Je zult dit expliciet moeten zeggen via een cast:

int g = (int) Math.round(Math.random() * 255);
        ^^^^^

U kunt ook gebruik maken van java.util.Random:

Random r = new Random();
int g = r.nextInt(256);

Antwoord 2, Autoriteit 33%

U probeert de compiler een impliciete primitieve versmallingconversie te hebben, door een longtoe te wijzen (het resultaat van Math.round) naar een int. Het kan niet impliciet worden gedaan; doe het expliciet met een cast.

int r = (int) Math.round(Math.random() * 255);

Antwoord 3

Math.random() geeft je een long, die veel groter kan zijn dan het waardenbereik dat een geheel getal kan vertegenwoordigen. Vervolgens wijst u die waarde toe aan een geheel getal.

Daar waarschuwt de compiler voor.

http://docs.oracle.com/ javase/7/docs/api/java/lang/Math.html

Other episodes