看看这个页面,看看第一个答案。这与您的问题相似,如果不是确切的问题。
JFrame 的paint()
方法已被弃用。编译器或您的 IDE 应该有点抱怨,特别是如果您将@Override
标签直接放在方法上方(使用它来测试此方法是否可以重写......也就是您正在尝试做的事情)。
这意味着不鼓励使用它,并且某些功能可能已被删除。使用 时javax.swing
,您会想全面了解系统JPanels
和JComponents
。要在屏幕上绘制某些东西,您需要添加一个JPanel
使用该add(Component c)
方法扩展的自定义类。然后,覆盖paintComponent(Graphics g)
该类中的方法。确保该方法的第一行是super.paintComponent(g);
这样,以便窗口可以自行刷新。
为了完整性:
public class MyWindow extends JFrame {
MyPanel thePanel;
public MyWindow(int x, int y) {
setSize(x, y);
thePanel = new MyPanel(x, y);
this.add(thePanel);
}
}
public class MyPanel extends JPanel {
public MyPanel(int x, int y)
setSize(x, y);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(ImageManager.getImage("Cute Puppy"), 40, 40, null); // Or whatever
}
}
因此,当在上调用repaint()
orrevalidate()
方法时MyWindow
,Panel 将收到一个paintComponent
调用。
如果您需要任何其他帮助,请在评论中告诉我。
编辑:
由于您需要使用MouseMotionListener,而我仍然不太了解“我需要从另一个类调用repaint”的上下文和麻烦......我会尽力而为。
首先,在 Oracle 页面上查看本教程。另外,请查看 GUI 上的其他内容。您将学到很多关于组织和展示的知识,这将使您意识到他们的系统如何与您的系统一起工作。
现在,对于您的问题:
i have to use MouseMotionListener.
不完全...这是一种设置的好方法,但您可以运行一个线程(不断反复运行方法的东西)来检查鼠标坐标。当您进入游戏和其他杂项应用程序时,您会想要开始这样做。
new Thread() {
public void run() {
Point mouse;
int mousex;
int mousey;
while (true) {
mouse = MouseInfo.getPointerInfo().getLocation();
mousex = mouse.x - theWindow.getLocationOnScreen().x - 3; // You'll need to get the
// x coordinate, subtract the window's x coordinate, and subtract 3 because of
// the blue border around a standard pc window.
mousey = mouse.y - theWindow.getLocationOnScreen().y - 29; // 29 is top bar height
SomeOtherClass.processMove(mousex, mousey);
}
}
}.start();
下一步:I tried that with JPanel but i could not do that.
如果您阅读我编辑顶部的教程,您会看到他们轻松实现 MouseMotionListener。
下一步:I prefer to do it with JFrame.
如果您希望在 JFrame 中处理鼠标,请执行以下操作:让您的 JFrame 作为侦听器,但 JPanel 是鼠标数据的来源。如下:
public class MyWindow extends JFrame implements MouseMotionListener {
public MyPanel thePanel;
public int x;
public int y;
public MyWindow() {
thePanel = new MyPanel();
thePanel.addMouseMotionListener(this);
// Make this JFrame get called when the mouse
// moves across the panel.
}
@Override
public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
thePanel.repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
public class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Other painting stuff
}
}
下一个:Now i have to update the frame from another class. I could not find a way to update the GUI(the frame) from another class.
简单的。由于 JPanel 是需要更新的,因此将以下方法添加到MyWindow
类中:
public void repaintWindow() {
thePanel.repaint();
}
并在需要更新时添加:
MyWindow theWindow = new MyWindow();
theWindow.repaintWindow();
下一个:all the answers here extended JPanel. So i could not find my answer.
我很抱歉,但你需要一个面板。可以使用 JFrames,但是如果您想开始做一些原始的和低级的事情,您需要通过阅读 oracle 教程和 oracle 文档来了解这些事情是如何工作的。现在,以我向您展示的任何方式使用 JPanel。
下一个:from another class I have to draw something on JFrame.Is that possible?
确实是的!每当你想画一些东西时:
MyWindow theWindow = new MyWindow();
Graphics g = theWindow.thePanel.getGraphics();
BufferedImage someRandomImage = SomeRandomClass.getRandomImage();
g.drawImage(someRandomImage, 200, 481, null);
theWindow.repaintWindow();
我真的希望我能帮上忙,但要使用 Java 编程,您需要使用他们提供的工具,尤其是在涉及到高级别的东西时,例如Swing
. 这些东西到处都有教程。请在将来寻求具体帮助之前阅读它们。