Я загрузил картинку в свой GUI, который отображается на JLabel. Размер маркировки установлен только 100 100, в то время как изображение намного больше, поэтому когда я загружаю его в маркировку, это расширяется.
Там должен так или иначе сделать, это автоматический изменяет размер к размеру маркировки?
Ниже слушатель действия для Изображения Загрузки JButton
class UploadHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int returnVal = fc.showOpenDialog(frame2);
file = fc.getSelectedFile();
pathname = file.getPath();
icon = new ImageIcon(pathname);
lblDisPic.setIcon(icon);
}
}
btnUpload = new JButton("Upload Picture");
lblDisPic = new JLabel();
lblDisPic.setBorder(raisedetched);
lblDisPic.setPreferredSize(d);
btnUpload.addActionListener(new UploadHandler());
Конечно, просто переопределите метод paintComponent
и вы сможете масштабировать и раскрашивать его как вам угодно.
myLabel = new JLabel (/*whatever*/) {
@Override
public void paintComponent (Graphics g) {
super.paintComponent (g);
g.drawImage (myImageIcon.getImage(), 0, 0, getWidth (), getHeight (), null);
}
};
Источник от здесь.
EDIT
Для добавления в код измените:
lblDisPic = new JLabel();
На:
lblDidPic = new JLabel() {
@Override
public void paintComponent (Graphics g) {
super.paintComponent (g);
if (icon != null) {
g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null);
}
}
};
В примере кода можно изменить размер изображения для отображения на JLabel
перед setIcon
вызывается метод.
Один из способов - изменить метод actionPerformed
, чтобы изображение загружалось из указанного файла, используя метод ImageIO.read
для чтения изображения, а затем изменяя размер изображения. перед созданием ImageIcon
.
Image img = ImageIO.read(fc.getSelectedFile());
Затем размер загруженного изображения можно изменить до размера JLabel
, используя Image.getScaledInstance
.
Image resizedImage =
img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null);
Теперь можно создать ImageIcon
для использования в JLabel
.
lblDisPic.setIcon(new ImageIcon(resizedImage));
Ограничение этого метода заключается в том, что если размер JLabel
каким-либо образом изменить, то изображение, содержащееся в JLabel
, не будет изменено. Однако, поскольку JLabel
будет использовать уменьшенное изображение оригинала, это будет означать, что объем требуемой памяти будет уменьшен (если это вызывает беспокойство), и исходное изображение не должно быть изменяется размер каждый раз при отображении изображения, как в случае переопределения метода paintComponent
.
Предпочтительный метод решения поставленной задачи будет зависеть от требований относительно того, понадобится ли исходное изображение позже или нет.
Двумя наиболее важными элементами любого решения динамического программирования являются:
Вы узнаете, что у вас есть правильные подпроблемы, определенные, когда
В вашем случае просто указать подпроблемы. Поскольку это, вероятно, домашнее задание, я просто дам вам подсказку, что вы можете пожелать, чтобы у N было меньше цифр, чтобы начать с .
-121--3866204- Может быть, если ваши префиксы имеют одинаковую длину, тогда вы можете сделать , где ПРАВО(число) в ('123456', '234456', 'etc', 'etc', 'etc')
Можно переопределить метод paintIcon
на самом значке -
ImageIcon icon = new ImageIcon(...) {
@Override
public void paintIcon( Component c, Graphics g, int x, int y ) {
g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c);
}
@Override
public int getIconHeight() {
// see below...
}
@Override
public int getIconWidth() {
// see below...
}
};
Edit -
Я понял, что первоначальный размер изображения учитывается, когда Метка решает, где разместить x, y Также необходимо переопределить методы getIconWidth () и getIconHeight ().
Однако их невозможно переопределить, чтобы вернуть размер метки, так как в этих методах нет ссылки на сам компонент.
Одним из подходов было бы создание нового класса, который расширяет ImageIcon
и передает компонент в - не большой выбор, потому что это нарушает «многократно используемые между многими компонентами» аспекты Icon.
Другой вариант состоит в том, чтобы просто переопределить эти методы во внутреннем классе, как описано выше, но поместить жестко закодированную ссылку на компонент как поле объекта или как окончательную
локальную переменную. Опять же, это ломает аспект «многократного использования между многими компонентами» и кажется немного «хакерским» в целом, но, поскольку это одноразовый внутренний класс, это может быть допустимо.