[英]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()時起作用。 不是我想做的。 為什么不再顯示一個框?
例如,下面是一個簡單的類,它在單擊鼠標時顯示鼠標位置:
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.