Итак, я сократил ваш пример, удалил MouseListener
s и просто установил курсор кнопок, и он работает нормально - я сбросил кнопки, чтобы нарисовать их границу и содержимое, чтобы я мог видеть их экстент, и курсор меняетсякогда мышь входит / существует в область, которую она охватывает, без проблем
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Display extends JFrame {
public static final int SCREEN_WIDTH = 600;
public static final int SCREEN_HEIGHT = 800;
public static void main(String[] args) {
// TODO Auto-generated method stub
new Display();
}
private Image screenImage;
private Graphics screenGraphic;
// private Image explainImage = new ImageIcon(Main.class.getResource("../images/explainSample.jpg")).getImage();
// private Image introBackground = new ImageIcon(Main.class.getResource("../images/background.jpg")).getImage();
// private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));
//
// private ImageIcon quitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/quitButtonBasic.png"));
// private ImageIcon quitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/quitButtonPressed.png"));
//
// private ImageIcon startButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
// private ImageIcon startButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
// private ImageIcon developerButtonBasicImage = new ImageIcon(Main.class.getResource("../images/developerButtonBasic.png"));
// private ImageIcon developerButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/developerButtonEntered.png"));
//
// private ImageIcon goButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
// private ImageIcon goButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
private JButton quitButton = new JButton(
"Quote");
private JButton startButton = new JButton(
"Start");
private JButton developerButton = new JButton(
"Developer");
private JButton goButton = new JButton(
new ImageIcon("Go"));
private int mouseX, mouseY;
private boolean isExplainScreen = false;
public Display() {
setUndecorated(true);
setTitle("RogueLike PoET");
setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// setBackground(new Color(0, 0, 0, 0));
setLayout(null);
//quitButton.setBounds(560, 30, 30, 30);
quitButton.setBounds(400, 200, 30, 30);
// quitButton.setBorderPainted(false);
// quitButton.setContentAreaFilled(false);
quitButton.setFocusPainted(false);
quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(quitButton);
startButton.setBounds(150, 540, 300, 60);
// startButton.setBorderPainted(false);
// startButton.setContentAreaFilled(false);
startButton.setFocusPainted(false);
startButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(startButton);
developerButton.setBounds(150, 610, 300, 60);
// developerButton.setBorderPainted(
// false);
// developerButton.setContentAreaFilled(
// false);
developerButton.setFocusPainted(
false);
developerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(developerButton);
goButton.setVisible(
false);
goButton.setBounds(
150, 720, 300, 60);
// goButton.setBorderPainted(
// false);
// goButton.setContentAreaFilled(
// false);
goButton.setFocusPainted(
false);
goButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(goButton);
}
public void paint(Graphics g) {
screenImage = createImage(SCREEN_WIDTH, SCREEN_HEIGHT);
screenGraphic = screenImage.getGraphics();
screenDraw(screenGraphic);
g.drawImage(screenImage, 0, 0, null);
}
public void screenDraw(Graphics g) {
// g.drawImage(introBackground, 0, 0, null);
paintComponents(g);
if (isExplainScreen) {
// g.drawImage(explainImage, 50, 50, null);
}
this.repaint();
}
}
Наблюдения
- Не переопределяйте
paint
контейнера верхнего уровня, например JFrame
.JFrame
является составным компонентом (он имеет ряд дочерних компонентов, составляющих его базовую функциональность), переопределение paint
может отрицательно повлиять на то, как эти компоненты окрашиваются.В отличие от контейнеров верхнего уровня, компоненты Swing по умолчанию имеют двойную буферизацию. - Кроме того, область «видимого просмотра» и область «окна» - это два разных понятия.Для получения дополнительной информации см. Как получить ТОЧНУЮ середину экрана, даже если изменить размер
- Кроме того, вы можете рисовать под декорациями окон (я знаю, это неокрашенное окно,но это все еще плохая привычка)
- Не пытайтесь поместить ВСЕ свою логику в один метод класса / рисования.Вместо этого разбивайте свои экраны на отдельные компоненты и используйте что-то вроде
CardLayout
для переключения между ними
Это ...
setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
, как правило, плохая идея.Лучше позволить дочерним компонентам диктовать свои предпочтительные размеры и просто pack
окно вокруг них
Не вызывать setVisible(true);
до того, как вы установили базовый пользовательский интерфейс, в противном случае некоторые компоненты могут не бытьнарисовано
Я не уверен, что вам подойдет от setBackground(new Color(0, 0, 0, 0));
, но, исходя из вашего нынешнего дизайна, это выглядит как пустая трата
Не звоните this.repaint();
или выполните любую другую операцию внутри цепочки краски, которая может вызвать repaint
.Это приведет вас к бесконечному циклу, который в конечном итоге будет потреблять все ваши циклы ЦП
setLayout(null);
не рекомендуется - многое зависит от того, как выстраиваются компоненты, вам предстоит много работывоспроизвести его
Вместо этого это может выглядеть примерно так (как отправная точка) ...
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Display());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class Display extends JPanel {
// private Image explainImage = new ImageIcon(Main.class.getResource("../images/explainSample.jpg")).getImage();
// private Image introBackground = new ImageIcon(Main.class.getResource("../images/background.jpg")).getImage();
// private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));
//
// private ImageIcon quitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/quitButtonBasic.png"));
// private ImageIcon quitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/quitButtonPressed.png"));
//
// private ImageIcon startButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
// private ImageIcon startButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
// private ImageIcon developerButtonBasicImage = new ImageIcon(Main.class.getResource("../images/developerButtonBasic.png"));
// private ImageIcon developerButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/developerButtonEntered.png"));
//
// private ImageIcon goButtonBasicImage = new ImageIcon(Main.class.getResource("../images/startButtonBasic.png"));
// private ImageIcon goButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/startButtonEntered.png"));
private JButton quitButton = new JButton(
"Quote");
private JButton startButton = new JButton(
"Start");
private JButton developerButton = new JButton(
"Developer");
private JButton goButton = new JButton(
new ImageIcon("Go"));
private int mouseX, mouseY;
private boolean isExplainScreen = false;
public Display() {
setLayout(null);
//quitButton.setBounds(560, 30, 30, 30);
quitButton.setBounds(400, 200, 30, 30);
// quitButton.setBorderPainted(false);
// quitButton.setContentAreaFilled(false);
quitButton.setFocusPainted(false);
quitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(quitButton);
startButton.setBounds(150, 540, 300, 60);
// startButton.setBorderPainted(false);
// startButton.setContentAreaFilled(false);
startButton.setFocusPainted(false);
startButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(startButton);
developerButton.setBounds(150, 610, 300, 60);
// developerButton.setBorderPainted(
// false);
// developerButton.setContentAreaFilled(
// false);
developerButton.setFocusPainted(
false);
developerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(developerButton);
goButton.setVisible(
false);
goButton.setBounds(
150, 720, 300, 60);
// goButton.setBorderPainted(
// false);
// goButton.setContentAreaFilled(
// false);
goButton.setFocusPainted(
false);
goButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
add(goButton);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 800);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(introBackground, 0, 0, null);
// This should be done else where
// if (isExplainScreen) {
// // g.drawImage(explainImage, 50, 50, null);
// }
//this.repaint();
}
}
}