我有一个程序选择工具。它打开一个带有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();
重绘整个组件,这是气垫船所说的。谢谢大家!希望这有助于解决未来的问题。
答案 0 :(得分:4)
通过直接调用paint(...)
并尝试在JComponent的paintComponent(...)
方法之外使用Graphics对象,您似乎错误地处理了Swing图形。不要这样做,因为所有的Swing图形教程都会告诉你(如果你还没有完成其中的一些,你很快就会想要这样做)。而是在JComponent中使用所有图形(例如JPanel的)paintComponent(...)
,首先调用super的方法,然后在paintComponent的方法参数中使用JVM提供的Graphics对象。
修改强>
教程链接:
我在想你必须重新编写大部分图形代码。你应该做出的改变:
paintComponent(...)
方法中绘制。 paintComponent(...)
方法的正上方放置一个@Override注释,以确保您实际上覆盖了超级方法。paintComponent(...)
称为paintComponent(...)
覆盖方法的第一行(通常)。getGraphics()
获得的Graphics对象(极少数例外)。paint(...)
或paintComponent(...)
(极少数例外情况 - 并且您当前的代码不符合例外情况之一,相信我)。repaint()