gpt4 book ai didi

java - 已编辑!未调用的 getter 函数导致 JPanel 在错误的位置重新打印

转载 作者:行者123 更新时间:2023-12-01 16:39:21 25 4
gpt4 key购买 nike

这很奇怪,我有一个 gui 程序,允许用户通过检测鼠标点击来更新 J 面板每次检测到鼠标单击时,JPanel 都会重新绘制自身。由于某种原因,即使通过测试,重绘也偏离了 30-40 像素,这表明它们是在完全相同的坐标处绘制的。但是,在我最小化然后重新最大化窗口后,这个问题就解决了。

以相同的方法检测到鼠标点击后调用重绘

编辑:下面是该错误的最小再现

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class CenterPanel extends JPanel{
private int sideLength = 50;
private int x = 10;
private int y = 10;

public CenterPanel() {
setPreferredSize(new Dimension(x*sideLength,y*sideLength));
addMouseListener(new Mouse());
}

public void paintComponent (Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
this.setBorder(new LineBorder(Color.BLACK,3));
try {
createCanvas(x,y,g,sideLength);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

private void createCanvas(int x, int y, Graphics g, int sideLength) throws InterruptedException {
int coordX=0;
int coordY=0;
for(int i=0; i<x;i++) {
for(int j=0; j<x;j++) {
paintRectangle(g,Color.LIGHT_GRAY,coordX,coordY,sideLength-1,sideLength-1);
coordX=coordX+sideLength;
}
coordX=0;
coordY=coordY+sideLength;
}
}

private static void paintRectangle(Graphics g,Color color,int x, int y,int width,int height) throws InterruptedException {
g.setColor(color);
g.fillRect(x, y, width, height);
}

class Mouse extends MouseAdapter{
public void mouseClicked (MouseEvent e) {
repaint();
}
}

public int getX() {
return x;
}

public int getY() {
return y;
}
}

import javax.swing.*;
import javax.swing.border.LineBorder;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class TestFrame extends JFrame implements MouseMotionListener, ActionListener{

private static Color currentColor = Color.lightGray;

private static Color defaultColor = Color.lightGray;

private CenterPanel centerPanel;
JButton red, yellow, white, pink, orange, magenta, light_gray, green, gray, dark_gray, cyan, blue, black;

public TestFrame() {
centerPanel=new CenterPanel();
gui();
}

private void gui() {
JPanel topPanel = new JPanel ();
topPanel.setBackground(Color.GREEN);
topPanel.setPreferredSize(new Dimension(50,50));

JPanel bottomPanel = new JPanel ();
bottomPanel.setBackground(Color.YELLOW);
bottomPanel.setPreferredSize(new Dimension(50,50));

JPanel leftPanel = new JPanel ();
leftPanel.setBackground(Color.RED);
leftPanel.setPreferredSize(new Dimension(50,50));

JPanel rightPanel = new JPanel ();
rightPanel.setBackground(Color.PINK);
rightPanel.setPreferredSize(new Dimension(50,50));

Container c = this.getContentPane();
c.setLayout(new BorderLayout());

c.add(centerPanel, BorderLayout.CENTER);
c.add(topPanel, BorderLayout.NORTH);
c.add(bottomPanel, BorderLayout.SOUTH);
c.add(leftPanel, BorderLayout.WEST);
c.add(rightPanel, BorderLayout.EAST);

this.setVisible(true);

pack();
}

public void actionPerformed(ActionEvent e) {

}

public static void main(String[] args) {
TestFrame t=new TestFrame();

}

@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub

}
}

Edit2:我通过将 Jpanels 添加到南北和西边界布局位置进行了另一项测试,发现中心边界布局位置(一个 Canvas 所在)未对齐并与其他 Jpanels 重叠,并在重新绘制后修复。这似乎是导致 Canvas 位置发生变化的原因。

Edit3:上述实验的照片 enter image description here

更新:我将 CenterPanel Jpanel 的 setSize() 更改为 setPreferredSize()。现在,无需调用重绘(鼠标单击)即可显示重叠。

**更新!!!我已将问题范围缩小到 CenterPanel 中的 getter 函数 **

    public int getX() {
return x;
}

public int getY() {
return y;
}

这两个。如果我删除它们,问题就会消失。问题是我仍然不明白为什么两个 getter 函数在没有被调用的情况下会导致这个问题???

最佳答案

您正在重写 JComponent(JPanel 的父类(super class))getX()getY() .

确定面板的位置后,它将调用这两个 getter 并将它们用作坐标 - 以像素为单位。

以不同的方式命名你的 setter/getter 。
并启用 IDE 的警告 WRT 缺少 @Override 注释。

关于java - 已编辑!未调用的 getter 函数导致 JPanel 在错误的位置重新打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com