2015-10-25 3 views
1

Как переопределить методы из не наследуемого класса? Во-вторых, есть ли лучший термин, чем «не унаследованные классы»?Java: переопределение методов из не унаследованных классов

У меня есть класс, который «расширяет» JFrame и должен переопределять paintComponent от JPanel. Как? Или он может расширить 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 и перерисовывал краску и называл неперекрываемую paintComponent() от paint(). не то, что я хочу делать. Почему окно больше не отображается?

ответ

4
  1. При создании Java-программ вам разрешено использовать несколько классов.
  2. Таким образом, вы можете использовать один класс JFrame
  3. И еще один расширитель JPanel - и переопределить метод paintComponent этого класса.
  4. Сказав это, обратите внимание, что вы можете рисовать себя в углу, предлагая вашему классу расширение JFrame, заставляя вас создавать и отображать JFrames, когда требуется больше гибкости. На самом деле, я бы рискнул, что большая часть кода GUI Swing, который я создал, и что я видел, не расширяет JFrame, и на самом деле редко бывает, что вы когда-нибудь захотите это сделать. Чаще всего ваши классы GUI будут ориентированы на создание JPanels, которые затем могут быть помещены в JFrames или JDialogs или JTabbedPanes или заменены через CardLayouts, где это необходимо. Это значительно повысит гибкость вашего графического интерфейса.

Например, вот простой класс, который отображает позицию мыши на мыши:

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 и необходимо переопределить paintComponent из JPanel. Как?

Как указано выше. Обратите внимание, что я не устанавливаю размеры, но вместо этого переопределяю JPANEL getPreferredSize(), если я хочу заставить его иметь определенный размер. Затем менеджеры компоновки делают все остальное, когда я вызываю pack() на JFrame.

Или она может продлить JPanel и необходимо получить доступ к методам, как SETTITLE(), setResizable(), и setDefaultCloseOperation() ...

Эти методы можно вызвать на экземпляре JFrame после вас Я создал его в соответствии с моим примером выше.

+0

Я сделал это: –

+0

@jacob: В вашем коде вы никогда не создаете окно верхнего уровня, такое как JFrame, а затем помещаете шахматную JPanel в это окно, поэтому ничего не будет отображаться. Посмотрите еще раз на мой код, как я покажу вам, как это сделать. Кроме того, никогда не вызывайте 'repaint()' из метода 'paintComponent'. Когда-либо. –

+0

Также не вызывайте 'setBackground (...)' изнутри paintComponent.Эта строка должна быть в конструкторе класса. –

Смежные вопросы