Я хочу создать пользовательскую кнопку, состоящую из большого и небольшого квадрата, которые имеют следующие цвета: #2980b9
#3498db
. Маленький квадрат будет внутри большого, и он увеличит его размер, когда курсор будет помещен выше или если он будет нажат, и в то же время цвет изменится на более чистый (#4AA3DF
).Проблемы с печатью пользовательской кнопки и создание работы MouseListener
Проблема в том, что распечатывается только меньшая, и она даже не распечатана хорошо; как он отображается в верхнем левом углу окна. Кроме того, функции MouseListener
не используются вообще.
Это Button
класс:
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
}
И это StartingPoint
класс:
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();
}
}
}
}
Это то, что консоль говорит:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Button.insideArea(Button.java:62)
at Button.mouseEntered(Button.java:92)
до тех пор, как я может понять, проблема имеет какое-то отношение к frame
, но я не знаю, как его решить. Я искал исключение java.lang.NullPointerException
, но я понял, что это происходит, когда вы не вызываете метод setSize()
или похожий, но я это сделал.
В чем проблема и что это лучший способ ее решить?
EDITED: Я понял, что причиной того, что консоль сказала, что она сказала, была mouseEvent
. Теперь каждый раз, когда я хочу ссылаться на курсор, я буду придерживаться e
между круглой скобкой при определении метода. В консоли нет ошибок; однако вещи печатаются таким же образом, и MouseListener все еще не работает.
EDIT: У меня больше нет исключений, потому что это произошло из-за MouseEvent mouseEvent
, но другие проблемы все еще существуют.
Что такое код в строке 62 класса Button? – Bohemian
У меня нет никаких исключений, потому что они были вызваны «MouseEvent mouseEvent», но вещи распечатываются одинаково, а MouseListener не работает. – SpaceCore186