为什么我的背景在重新粉刷后会出现故障?

时间:2012-08-08 21:10:20

标签: java swing graphics repaint paintcomponent

我有一个程序选择工具。它打开一个带有17个按钮的JFrame,其中15个可自定义,并且它们从位于C:驱动器的.txt文档中获取文本。当我单击分配按钮时,它会打开一个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 个答案:

答案 0 :(得分:4)

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

修改
教程链接:

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

  • 仅在JPanel或其他JComponent派生类中绘制,而不是在JFrame或其他顶级窗口中绘制。
  • 在班级的paintComponent(...)方法中绘制。
  • paintComponent(...)方法的正上方放置一个@Override注释,以确保您实际上覆盖了超级方法。
  • 将超级paintComponent(...)称为paintComponent(...)覆盖方法的第一行(通常)。
  • 使用JVM传递给此方法的Graphics对象。
  • 不要使用通过在组件上调用getGraphics()获得的Graphics对象(极少数例外)。
  • 不要为您的类提供图形字段并尝试将Graphics对象存储在其中。 JVM提供的Graphics对象不会持久存在,很快就会变为null或不可用。
  • 请勿直接致电paint(...)paintComponent(...)(极少数例外情况 - 并且您当前的代码不符合例外情况之一,相信我)。
  • 您可能不需要在JButtons上调用repaint()