基本上,我有一个 JApplet,它尝试使用图形进行绘制(即 g.drawOval(10,10,100,100) 并且还包括 JCompotents(即 JButton)。发生的情况是重绘会变得非常古怪。
有时图形会覆盖小部件或反之亦然。它不可靠并导致不可预测的行为。
(按钮也总是在这些图形的顶部)
我已经尝试过尝试覆盖或手动绘制组件、更改订单等,但我认为我在这里遗漏了一些非常基本的东西。任何人都有使用 g.drawXXX 和 JCompotents 的模板或正确方法?
基本上,我有一个 JApplet,它尝试使用图形进行绘制(即 g.drawOval(10,10,100,100) 并且还包括 JCompotents(即 JButton)。发生的情况是重绘会变得非常古怪。
有时图形会覆盖小部件或反之亦然。它不可靠并导致不可预测的行为。
(按钮也总是在这些图形的顶部)
我已经尝试过尝试覆盖或手动绘制组件、更改订单等,但我认为我在这里遗漏了一些非常基本的东西。任何人都有使用 g.drawXXX 和 JCompotents 的模板或正确方法?
再次,只要按照我的建议,
确保永远不要直接在 JApplet 中绘制,而是在 JPanel 或其 contentPane(即 JPanel)中绘制。确保在此 JPanel 的 paintComponent(...) 方法中进行绘制。
它有效:
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
public class Test2 extends JApplet {
public void init() {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
Test2BPanel panel = new Test2BPanel();
setContentPane(panel);
}
});
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Test2BPanel extends JPanel {
private String[] backgroundImageFileNames = { "test", "test", "test" };
private JButton refreshButton;
private JComboBox backgroundList;
public Test2BPanel() {
setBackground(Color.white);
setLayout(new FlowLayout());
refreshButton = new JButton("replant new forest");
refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
add(refreshButton);
backgroundList = new JComboBox(backgroundImageFileNames);
backgroundList.setSelectedIndex(2);
add(backgroundList);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
paintIt(g);
}
public void paintIt(Graphics g) {
for (int i = 0; i < 200; i++) {
for (int j = 0; j < 200; j++) {
g.setColor(Color.red);
g.drawOval(10 * i, j, 10, 10);
}
}
}
}
另外,请查看 Swing 绘画教程,包括基本绘画教程和高级绘画教程。
有关这方面以及更多内容的好书,请查看Chet Haase 和 Romain Guy 的《购买肮脏的富客户》。您不会后悔购买!这是我拥有的最好的 Java 书籍之一。