2015-12-12 10 views
2


Я пытаюсь создать класс (называемый запас), который может быть идентифицирован как компонент, и позвольте мне использовать Listener на нем.
Однако, это не окрашено, если вы не указали (не очень хорошая идея!), Чтобы нарисовать его в панели panel.paint().
Программа работает как это:
Мой пользовательский компонент не может быть окрашен

  JFrame frame = new JFrame (".."); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      final Stock theStock=new Stock(); 
      JPanel primary = new JPanel(); 
      primary.setPreferredSize(new Dimension(500,500)); 
      primary.add(theStock); 
      frame.getContentPane().add(primary); 
      frame.pack(); 
      frame.setVisible(true); 

The Stock не будет окрашиваться, если первичный (JPanel) является перекрываться, так что есть спецификация вызова запас рисовать:

@Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.black); 
     g.drawRect(x-2, y-2, 74, 124); 
    } 

Вот мой код - я думаю, проблема может произойти, потому что я не переопределял ничего, кроме метода рисования, унаследованного от Component.
********** Модифицированный быть проверяемым, пожалуйста, смотрите ниже
**

import java.awt.*; 

import javax.swing.*; 


@SuppressWarnings("serial") 
public class Stock extends Component{ 
    private int x; //the position for image 
    private int y;//position for image 

    public Stock() { 
     x=285; 
     y=280; 

    } 


    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.black); 
     g.drawRect(x-2, y-2, 74, 124); 
    } 

    public void works(){ 
      JFrame frame = new JFrame (".."); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      final Stock theStock=new Stock(); 
      JPanel primary = new JPanel(){ 
       @Override 
       protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        theStock.paint(g); 
       } 
      }; 
      primary.setPreferredSize(new Dimension(500,500)); 
      primary.add(theStock); 
      frame.getContentPane().add(primary); 
      frame.pack(); 
      frame.setVisible(true); 
    } 

    public void doesNotWork(){ 
      JFrame frame = new JFrame (".."); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      final Stock theStock=new Stock(); 
      JPanel primary = new JPanel(); 
      primary.setPreferredSize(new Dimension(500,500)); 
      primary.add(theStock); 
      frame.getContentPane().add(primary); 
      frame.pack(); 
      frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Stock a = new Stock(); 
     a.works(); 
     //a.doesNotWork(); 
    } 
} 

p.s.1. Я не использую JComponent, потому что JComponent имеет больше функциональных возможностей, чем мне нужно использовать. Компонент, из которого наследуется Container и Button, должен работать хорошо.

п.с.2. Даже вы используете JComponent, вы получаете тот же результат. Код ниже.

import java.awt.*; 

импорт javax.swing. *;

@SuppressWarnings("serial") 
public class Stock extends JComponent{ 
    private int x; //the position for image 
    private int y;//position for image 

    public Stock() { 
     x=285; 
     y=280; 

    } 



    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawRect(x-2, y-2, 74, 124); 
    } 

    public void works(){ 
      JFrame frame = new JFrame (".."); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      final Stock theStock=new Stock(); 
      JPanel primary = new JPanel(){ 
       @Override 
       protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        theStock.paint(g); 
       } 
      }; 
      primary.setPreferredSize(new Dimension(500,500)); 
      primary.add(theStock); 
      frame.getContentPane().add(primary); 
      frame.pack(); 
      frame.setVisible(true); 
    } 

    public void doesNotWork(){ 
      JFrame frame = new JFrame (".."); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      final Stock theStock=new Stock(); 
      JPanel primary = new JPanel(); 
      primary.setPreferredSize(new Dimension(500,500)); 
      primary.add(theStock); 
      frame.getContentPane().add(primary); 
      frame.pack(); 
      frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Stock a = new Stock(); 
     //a.works(); 
     a.doesNotWork(); 
    } 
} 
+0

Где ваш главный метод? Как вы используете этот класс? И @Ashiquzzaman, он не может переопределить paintComponent, потому что его класс (по какой-то неизвестной причине) не расширяет JComponent или JPanel, а скорее компонент AWT-класса? –

+0

@HovercraftFullOfEels, Извините, я не заметил. – ashiquzzaman33

+0

@Ashiquzzaman: проблем нет, но остальные вопросы в моем сообщении выше. Г-н K. Mole - пожалуйста, покажите нам, как вы используете этот класс, и, пожалуйста, сообщите нам, почему вы пытаетесь использовать устаревший класс компонентов AWT, компонент и не менее устаревшие классы компонентов Swing , –

ответ

3

Ваша проблема заключается в одном из макетов, размеров и предпочтительных размеров. Так как вы добавляете ваш Stock компонент к FlowLayout используя JPanel, компонентный размер будет сам на его предпочтительный размер, который является 0, 0. Если вы дали JPanel другой макет, скажем

 primary.setLayout(new BorderLayout()); 

, а затем добавил ваш фондовый объект, он заполнит основной JPanel, и он будет рисовать сам.

Другие варианты включают настройки вашего запаса объектов PreferredSize, или даже перекрывая его метод getPreferredSize() так, что он достаточно велик:

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

Да ... Я попытался установить preferredSize для моего основного ... lol. Большое спасибо!!! –

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