有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的背景在重新绘制后会出现问题?

我有一个我制作的程序选择工具。它打开一个包含17个按钮的JFrame,其中15个按钮是可自定义的,它们从一个窗口获取文本。txt文档位于C:驱动器中。当我单击assign按钮时,它会打开一个JFileChooser,以便在单击该按钮时选择要打开的文件。然后选择要更改的按钮,然后键入希望该按钮显示的文本。之后,程序将重写。txt文件并更新按钮。以下是更新代码:

public static void restart() {
    start.assignButtonActions();
    start.assignButtonText();
    start.paint(graphics);
}
public void assignButtonActions() {
    /**
     * assign button actions
     */
    for (int i = 0; i < buttonAction.length; i++) {
        buttonAction[i] = io.readSpecificFromHD("C:\\ButtonActions.txt", i
                + 1 + actionButton.length);
    }
}

public void assignButtonText() {
    for (int i = 0; i < actionButton.length; i++) {
        /**
         * set button text
         */
        actionButton[i].setText(io.readSpecificFromHD(
                "C:\\ButtonActions.txt", i + 1));
    }

}
public void paint(Graphics g) {
    g.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH,
            FRAMEHEIGHT, null);
    refresh();
}

public void refresh() {
    graphics.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH,
            FRAMEHEIGHT, null);
    for (int i = 0; i < actionButton.length; i++) {
        actionButton[i].repaint();
    }
    assignButton.repaint();
    helpButton.repaint();
}

我相信这就是这个问题所需要的全部代码。问题是,在调用方法restart()之后,背景就在那里,按钮周围有一个白色的正方形,正方形内部是白色的。这不是什么大问题,但真的很烦人,很不专业。起初,我认为是在绘制背景后,按钮正在调整大小,所以我将其设置为每次调用刷新时运行两次。一点帮助也没有

编辑: 我解决了这个问题。我接受了气垫船的答案,并对我学到的稍加修改。我所要做的就是将restart()方法修改为:

public static void restart() {
    start.assignButtonActions();
    start.assignButtonText();
    start.repaint();
}

因为repaint();重新绘制了气垫船所说的整个组件。谢谢大家!希望这对以后的问题有所帮助


共 (1) 个答案

  1. # 1 楼答案

    通过直接调用paint(...)并尝试在JComponent的paintComponent(...)方法之外使用图形对象,您似乎在错误地处理Swing图形。不要这样做,因为所有的Swing图形教程都会告诉你(如果你还没有读过其中的一些教程,你很快就会想这么做)。相反,在JComponent(比如JPanel)中执行所有图形,首先调用super的方法,并在paintComponent的方法参数中使用JVM提供的graphics对象

    编辑
    教程链接:

    我想你必须重新编写大部分图形代码。您应该做的更改:

    • 仅在JPanel或其他JComponent派生类中绘制,而不是在JFrame或其他顶级窗口中绘制
    • 绘制类的paintComponent(...)方法
    • paintComponent(...)方法上方放置一个@Override注释,以确保您实际上正在重写super方法
    • 调用super的paintComponent(...)作为paintComponent(...)重写方法的第一行(通常)
    • 使用JVM传递给这个方法的图形对象
    • 不要使用通过对组件调用getGraphics()获得的图形对象(很少有例外)
    • 不要给你的类一个图形字段,并尝试在其中存储图形对象。JVM提供的图形对象不会持久化,很快就会变为null或不可用
    • 不要自己直接调用paint(...)paintComponent(...)(除了极少数例外,而且您当前的代码不符合例外条件,相信我)
    • 您可能不需要在JButtons上调用repaint()