Неопределенный конструктор пользовательского компонента в Java

#java #swing

#java #swing

Вопрос:

Я пытаюсь заменить свои Jlabels пользовательским JComponent с именем PhotoComponent. До сих пор я следовал всем шагам, изложенным в моем инструкторском видео о том, как создать компонент. Однако при попытке заменить нужные Jlabels этими двумя ошибками:

     The constructor PhotoComponent() is undefined
    The method currentPic(ImageIcon) is undefined for the type new ActionListener(){}
  

Это код для моего пользовательского компонента:

 import javax.swing.ImageIcon;
import javax.swing.JComponent;

public class PhotoComponent extends JComponent {
    private ImageIcon pic;

    public PhotoComponent(){

    }

    public PhotoComponent(ImageIcon p){
        pic=p;
        this.setSize(pic.getIconWidth(),pic.getIconHeight());
    }

    public void PaintComponent(Graphics g){
        pic.paintIcon(this, g, 0, 0);
    }
}
  

Комментарии:

1. public void PaintComponent(Graphics g){ неверно, на очень многих уровнях

2. Метод currentPic не существует, вы определили currentPic как экземпляр PhotoComponent , поэтому я предполагаю, что вы хотите вызвать для него метод

Ответ №1:

Метод currentPic не существует, вы определили currentPic его как экземпляр PhotoComponent , поэтому я предполагаю, что вы хотите вызвать для него метод.

Если вы хотите создать новый экземпляр PhotoComponent , то вам следует использовать

 currentPic = new PhotoComponent(picList.get(pos))
  

Но лично я бы не стал этого делать, вместо этого у меня был бы setIcon метод, определенный в PhotoComponent , чтобы я мог просто изменить отображаемое изображение

 public class PhotoComponent extends JComponent {

    private ImageIcon pic;

    public PhotoComponent() {

    }

    public PhotoComponent(ImageIcon p) {
        pic = p;
        this.setSize(pic.getIconWidth(), pic.getIconHeight());
    }
    
    public void setIcon(ImageIcon icon) {
        pic = icon;
        repaint();
    }

    public void PaintComponent(Graphics g) {
        pic.paintIcon(this, g, 0, 0);
    }
}
  

Затем вы бы изменили все вызовы, такие currentPic(picList.get(pos)); как currentPic.setIcon(picList.get(pos));

Как бы то ни было, PhotoComponent на самом деле не настроен должным образом, поскольку на самом деле он ничего не рисует

Во-первых, setSize следует избегать, так как многие компоненты просто проигнорируют его и вместо этого будут использовать подсказки по размеру, preferred / minimum / maximum size.

Другая проблема заключается в том, PaintComponent что он определен неправильно. Помните, что Java чувствительна к регистру, это означает, что если вы хотите переопределить метод, вам нужно правильно написать его.

Вы должны заменить его чем-то более похожим…

 @Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    pic.paintIcon(this, g, 0, 0);
}
  

Итак, принимая во внимание приведенные выше комментарии к, PhotoComponent должно выглядеть что-то более похожее…

 public class PhotoComponent extends JComponent {

    private ImageIcon pic;

    public PhotoComponent() {

    }

    public PhotoComponent(ImageIcon p) {
        pic = p;
    }

    public void setIcon(ImageIcon icon) {
        pic = icon;
        revalidate()
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        if (pic == null) {
            return new Dimension(0, 0);
        }
        return new Dimension(pic.getIconWidth(), pic.getIconHeight());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        pic.paintIcon(this, g, 0, 0);
    }
}
  

Кроме того, законченное использование mainPic.add(currentPic); , это не то, как вы должны использовать JScrollPane … и на самом деле, вам нужно вызвать mainPic.setViewportView(currentPic); только один раз, когда вы инициализируете пользовательский интерфейс

Я бы рекомендовал вам прочитать и отметить книгу