#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);
только один раз, когда вы инициализируете пользовательский интерфейс
Я бы рекомендовал вам прочитать и отметить книгу