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 long
64 bits is en een int
is 32 bits, om nog maar te zwijgen Om van long
te 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 long
toe 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