簡體   English   中英

Java:從非繼承類覆蓋方法

[英]Java: Overriding methods from non inherited classes

如何/可以重寫非繼承類中的方法? 其次,有沒有比“非繼承類”更好的術語?

我有一個“擴展” 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()調用了一個非覆蓋的paintComponent()時起作用。 不是我想做的。 為什么不再顯示一個框?

  1. 創建Java程序時,可以使用多個類。
  2. 因此,您可以讓一個類擴展JFrame
  3. 另一個擴展JPanel -並覆蓋該類的paintComponent方法。
  4. 話雖如此,請注意,當您經常需要更大的靈活性時,可以通過使類擴展JFrame來迫使您創建和顯示JFrame,從而使自己陷入困境。 實際上,我會冒險地說,我創建的大多數Swing GUI代碼都不會擴展JFrame,實際上,很少有人願意這樣做。 更常見的是,您的GUI類將面向創建JPanels,然后將其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要時通過CardLayouts進行交換。 這將大大增加GUI編碼的靈活性。

例如,下面是一個簡單的類,它在單擊鼠標時顯示鼠標位置:

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();
            }
        });
    }
}

關於

我有一個“擴展” JFrame的類,需要從JPanel重寫paintComponent。 怎么樣?

如上所述。 請注意,我避免設置大小,但是如果我想將其強制為某個大小,則重寫JPanel的getPreferredSize() 然后,當我在JFrame上調用pack()時,布局管理器將完成其余工作。

或者它可以擴展JPanel並需要訪問setTitle(),setResizable()和setDefaultCloseOperation()之類的方法...

按照上面的示例創建了JFrame實例后,可以在JFrame實例上簡單地調用這些方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM