将 mouseListener 添加到使用 paintComponent 方法绘制的组件
Adding a mouseListener to a component drawn with the paintComponent method
我正在尝试向我创建的每个 Jlabel 添加一个 mouseListener,然后将它们传递到
paintComponent.
private List<JLabel> createTiles (){
int x = 10;
int y = 0;
List<JLabel> tiles = new ArrayList<>();
//Number of tiles painted
for (Integer i : gameModelHandle.numbersToDigits()) {
JLabel tile = new JLabel("" + i, JLabel.CENTER);
tile.setSize(new Dimension(140, 140));
tile.setFont(tile.getFont().deriveFont(45f));
tile.setLocation(x, y);
tile.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
GameModel.currentSum(i);
changeColour();
}
@Override
public void mouseReleased(MouseEvent e) {
if (getBounds().intersects(tile.getBounds())){
int number = gameModelHandle.combineDigits(i, Integer.parseInt(tile.getText()));
GameModel.currentSum(number);
}
}
});
tiles.add(tile);
x+=150;
}
return tiles;
}
如您所见,图块的数量永远不会相同,这就是我无法手动创建它们的原因;我有一个循环。
我是这样画的:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.removeAll();
for (JLabel i : createTiles()) {
g.setColor(tileColours[activeColourIndex]);
g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
this.add(i);
}
revalidate();
}
而且它有效,问题是我的 mouseListeners 似乎根本不起作用。我试过调试,但从未接触到 mouseClick 方法。
如有任何意见或指导,我们将不胜感激。
您不需要一遍又一遍地在 paintComponent
中创建 JLabel
。创建一次并继续重复使用标签列表来更新它们。我能够创建一个工作示例,它似乎工作正常。
鼠标处理程序也在工作。
这是我的资料。看一看。我不得不删除不必要的部分并调整代码以编译和启动它 运行.
public class PaintComponentMouseListener extends JPanel {
private static final long serialVersionUID = -4235693652966961963L;
private List<JLabel> tiles;
private List<JLabel> createTiles() {
if(tiles == null) {
tiles = new ArrayList<>();
int x = 10;
int y = 0;
// Number of tiles painted
for(int i=1;i<=9;i++) {
String btn = "" + i;
JLabel tile = new JLabel(btn, JLabel.CENTER);
tile.setSize(new Dimension(140, 140));
tile.setFont(tile.getFont().deriveFont(45f));
tile.setLocation(x, y);
tile.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Clicked on button: " + btn);
}
});
tiles.add(tile);
x += 150;
}
}
return tiles;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.removeAll();
for (JLabel i : createTiles()) {
g.setColor(Color.CYAN);
g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
this.add(i);
}
revalidate();
}
private void start() {
JFrame frame = new JFrame("Hello");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(3, 3));
frame.setContentPane(this);
frame.setSize(500, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
new PaintComponentMouseListener().start();
});
}
}
希望对您有所帮助!
我正在尝试向我创建的每个 Jlabel 添加一个 mouseListener,然后将它们传递到 paintComponent.
private List<JLabel> createTiles (){
int x = 10;
int y = 0;
List<JLabel> tiles = new ArrayList<>();
//Number of tiles painted
for (Integer i : gameModelHandle.numbersToDigits()) {
JLabel tile = new JLabel("" + i, JLabel.CENTER);
tile.setSize(new Dimension(140, 140));
tile.setFont(tile.getFont().deriveFont(45f));
tile.setLocation(x, y);
tile.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
GameModel.currentSum(i);
changeColour();
}
@Override
public void mouseReleased(MouseEvent e) {
if (getBounds().intersects(tile.getBounds())){
int number = gameModelHandle.combineDigits(i, Integer.parseInt(tile.getText()));
GameModel.currentSum(number);
}
}
});
tiles.add(tile);
x+=150;
}
return tiles;
}
如您所见,图块的数量永远不会相同,这就是我无法手动创建它们的原因;我有一个循环。
我是这样画的:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.removeAll();
for (JLabel i : createTiles()) {
g.setColor(tileColours[activeColourIndex]);
g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
this.add(i);
}
revalidate();
}
而且它有效,问题是我的 mouseListeners 似乎根本不起作用。我试过调试,但从未接触到 mouseClick 方法。
如有任何意见或指导,我们将不胜感激。
您不需要一遍又一遍地在 paintComponent
中创建 JLabel
。创建一次并继续重复使用标签列表来更新它们。我能够创建一个工作示例,它似乎工作正常。
鼠标处理程序也在工作。
这是我的资料。看一看。我不得不删除不必要的部分并调整代码以编译和启动它 运行.
public class PaintComponentMouseListener extends JPanel {
private static final long serialVersionUID = -4235693652966961963L;
private List<JLabel> tiles;
private List<JLabel> createTiles() {
if(tiles == null) {
tiles = new ArrayList<>();
int x = 10;
int y = 0;
// Number of tiles painted
for(int i=1;i<=9;i++) {
String btn = "" + i;
JLabel tile = new JLabel(btn, JLabel.CENTER);
tile.setSize(new Dimension(140, 140));
tile.setFont(tile.getFont().deriveFont(45f));
tile.setLocation(x, y);
tile.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Clicked on button: " + btn);
}
});
tiles.add(tile);
x += 150;
}
}
return tiles;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.removeAll();
for (JLabel i : createTiles()) {
g.setColor(Color.CYAN);
g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
this.add(i);
}
revalidate();
}
private void start() {
JFrame frame = new JFrame("Hello");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(3, 3));
frame.setContentPane(this);
frame.setSize(500, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
new PaintComponentMouseListener().start();
});
}
}
希望对您有所帮助!