Ich möchte eine benutzerdefinierte Schaltfläche, die aus einem großen und einem kleinen Quadrat, die jeweils diese Farben haben: #2980b9
#3498db
. Das kleine Quadrat würde innerhalb des großen sein, und es würde seine Größe erhöhen, wenn der Cursor über oder wenn es angeklickt wird, und gleichzeitig würde sich die Farbe zu einem klareren ändern (#4AA3DF
).Probleme beim Ausdrucken einer benutzerdefinierten Schaltfläche und Erstellen von MouseListener
Das Problem ist, dass nur der kleinere ausgedruckt wird, und es ist nicht einmal gut ausgedruckt; wie es in der oberen linken Ecke des Fensters erscheint. Außerdem werden die MouseListener
Funktionen überhaupt nicht verwendet. Diese
ist die Button
Klasse:
public class Button extends JComponent implements MouseListener {
private static final long serialVersionUID = 1L;
JFrame frame = new JFrame();
public Button(JFrame frame) {
enableInputMethods(true);
addMouseListener(this);
this.frame = frame;
}
// Mouse activity //DELETED
MouseEvent mouseEvent; //DELETED
// Window's width and height.
int width = (int) frame.getWidth();
int height = (int) frame.getHeight();
// Squares's sizes.
int bigSquareXSize = 200;
int bigSquareYSize = 200;
int smallSquareXSize = 180;
int smallSquareYSize = 180;
// smallSquare color.
volatile String color = "#3498db";
//I think that I should do something with the update method,
//but i'm not sure about what (sorry, I know this is stupid).
public void update() {
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// Squares's X and Y positions.
int bigSquareXPosition = width/2 - bigSquareXSize/2;
int bigSquareYPosition = height/2 - bigSquareYSize/2;
int smallSquareXPosition = width/2 - smallSquareXSize/2;
int smallSquareYPosition = height/2 - smallSquareYSize/2;
g.setColor(Color.decode("#2980b9"));
g2.setColor(Color.decode(color));
g.fillRect(bigSquareXPosition, bigSquareYPosition, bigSquareXSize, bigSquareYSize);
g2.fillRect(smallSquareXPosition, smallSquareYPosition, smallSquareXSize, smallSquareYSize);
}
// Returns a true value if the cursor is placed over the smallSquare.
public boolean insideArea(MouseEvent e) {
boolean value = false;
int smallSquareXPosition = width/2 - smallSquareXSize/2;
int smallSquareYPosition = height/2 - smallSquareYSize/2;
if (e.getX() > smallSquareXPosition && e.getX() < smallSquareXPosition + smallSquareXSize) {
if (e.getY() > smallSquareYPosition && e.getY() < smallSquareYPosition + smallSquareYSize) {
value = true;
}
}
return value;
}
volatile boolean clicked = false;
@Override
public void mouseClicked(MouseEvent e) {
if (insideArea(e)) {
clicked = !clicked;
if (clicked) {
color = "#4AA3DF";
smallSquareXSize = 190;
smallSquareYSize = 190;
}
} else {
color = "#3498db";
smallSquareXSize = 180;
smallSquareYSize = 180;
}
this.repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
if (!clicked) {
if (insideArea(e)) {
color = "#4AA3DF";
smallSquareXSize = 190;
smallSquareYSize = 190;
}
}
this.repaint();
}
@Override
public void mouseExited(MouseEvent e) {
if (!clicked) {
if (insideArea(e)) {
color = "#3498db";
smallSquareXSize = 180;
smallSquareYSize = 180;
}
}
this.repaint();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
Und das ist die StartingPoint
Klasse:
public class StartingPoint implements Runnable {
Thread thread = new Thread(this);
static JFrame frame = new JFrame("BUTTON!");
static Button button = new Button(frame);
public static void main(String[] args) {
//Frame creation
JFrame frame = new JFrame("BUTTON!");
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(button);
frame.add(panel);
}
@Override
public void run() {
while (true) {
button.update();
try {
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Dies ist, was die Konsole sagt:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Button.insideArea(Button.java:62)
at Button.mouseEntered(Button.java:92)
Für soweit ich kann verstehen, das Problem hat etwas mit derzu tun 0, aber ich weiß nicht, wie ich es lösen soll. Ich suchte nach der java.lang.NullPointerException
Ausnahme, aber was ich verstanden habe ist, dass es passiert, wenn Sie nicht die setSize()
Methode oder eine ähnliche anrufen, aber ich tat.
Was ist das Problem und was ist der beste Weg, es zu lösen?
EDITED: Ich fand heraus, dass was die Konsole zu sagen, was es sagte, war die mouseEvent
. Jetzt jedes Mal, wenn ich auf den Cursor verweisen möchte, bleibe ich bei der Definition der Methode mit dem e
zwischen den Klammern. Es gibt keinen Fehler in der Konsole; Die Dinge werden jedoch auf die gleiche Weise gedruckt und MouseListener funktioniert immer noch nicht.
EDIT: Ich habe keine Ausnahmen mehr, weil es wegen der MouseEvent mouseEvent
gab, aber die anderen Probleme sind immer noch da.
Wie lautet der Code in Zeile 62 der Button-Klasse? – Bohemian
Ich habe keine Ausnahmen mehr, weil es wegen des 'MouseEvent mouseEvent' gab, aber Dinge werden auf die gleiche Weise ausgedruckt und MouseListener funktioniert nicht. – SpaceCore186