Java:覆盖非继承的方法 类

Java: Overriding methods from non inherited classes

你如何do/can覆盖非继承的方法class?其次有没有比"non-inherited classes"更好的术语?

我有一个 class "extends" JFrame,需要从 JPanel 覆盖 paintComponent。如何?或者它可以扩展 JPanel 并需要访问 setTitle()、setResizable() 和 setDefaultCloseOperation() 等方法;

回复最新回答:

我已经这样做了:

public class Chess extends JPanel {

boolean du, dd, dl, dr;
double x, y;
public class AL extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        int keyC = e.getKeyCode();
        switch(keyC) {
            case KeyEvent.VK_LEFT:
                dl = true;
                break;
            case KeyEvent.VK_RIGHT:
                dr = true;
                break;
            case KeyEvent.VK_DOWN:
                dd = true;
                break;
            case KeyEvent.VK_UP:
                du = true;
                break;
        }

    }
    public void keyReleased(KeyEvent e) {
         int keyC = e.getKeyCode();
        switch(keyC) {
            case KeyEvent.VK_LEFT:
                dl = false;
                break;
            case KeyEvent.VK_RIGHT:
                dr = false;
                break;
            case KeyEvent.VK_DOWN:
                dd = false;
                break;
            case KeyEvent.VK_UP:
                du = false;
                break;
        }
    }
}

public void Chess() {
    JFrame frame = new JFrame();
    frame.addKeyListener(new AL());
    frame.setTitle("Chess");
    frame.setSize(500, 500);
    frame.setResizable(false);
    frame.setVisible(true);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    du = dl = dd = dr = false;
    x = y = 150;

}

public void paintComponent(Graphics g) {

    super.paintComponent(g);

    setBackground(Color.CYAN);


    double i = .25;
    if (du) {
        y -= i;
    }
    if (dr) {
        x += i;
    }
    if (dd) {
        y += i;
    }
    if (dl) {
        x -= i;
    }

    if (x < 0) {
        x = 0;
    }
    if (x > getWidth() - 25) {
        x = getWidth() - 25;
    }
    if (y < 25) {
        y = 25;
    }
    if (y > getHeight() - 25) {
        y = getHeight() - 25;
    }

    g.drawOval( (int) x, (int) y, 25, 25);
    repaint();

}
public static void main(String[] args) {
    new Chess();
}

}

它应该在屏幕上移动椭圆形(我正在尝试了解基础知识)但是当我 运行 它时,不会出现一个框。它在使用 jFrame 并覆盖 paint 并从 paint() 调用非覆盖的 paintComponent() 时起作用。不是我想做的。为什么不再出现一个框?

  1. 您可以在创建 Java 程序时使用多个 class。
  2. 所以你可以 class 扩展 JFrame
  3. 另一个扩展 JPanel —— 并覆盖 class 的 paintComponent 方法。
  4. 话虽如此,但请注意,让 class 扩展 JFrame 可能会把自己画在角落里,迫使您创建和显示 JFrame,而这通常需要更大的灵活性。事实上,我敢说我创建的和我见过的大多数 Swing GUI 代码 没有 扩展 JFrame,事实上你很少会想做这个。更常见的是,您的 GUI classes 将用于创建 JPanel,然后可以将其放入 JFrames 或 JDialogs,或 JTabbedPanes,或通过 CardLayouts 在任何需要的地方进行交换。这将大大增加您的 GUI 编码的灵活性。

例如,这里有一个简单的 class 显示鼠标点击时的鼠标位置:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class MousePosition extends JPanel {
    private static final int PREF_W = 600;
    private static final int PREF_H = PREF_W;
    // format String for display String
    protected static final String FORMAT = "(%d, %d)";
    private int xPos = -40;
    private int yPos = -40;
    private String displayText = "";

    public MousePosition() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                xPos = e.getX();
                yPos = e.getY();
                // use FORMAT String to create our display text
                displayText = String.format(FORMAT, xPos, yPos);
                repaint();
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(displayText, xPos, yPos);

    }

    private static void createAndShowGui() {
        MousePosition mainPanel = new MousePosition();

        JFrame frame = new JFrame("MousePosition");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

关于

I have a class that "extends" JFrame and needs to override paintComponent from JPanel. How?

如上所述。请注意,我避免设置大小,而是覆盖 JPanel 的 getPreferredSize()(如果我想将其强制设置为特定大小)。然后,当我在 JFrame 上调用 pack() 时,布局管理器会完成剩下的工作。

Or it can extend JPanel and needs to access methods like setTitle(), setResizable(), and setDefaultCloseOperation()...

按照我上面的示例创建 JFrame 实例后,可以简单地在 JFrame 实例上调用这些方法。