2014-09-29 5 views
4

Я использую JLabel для просмотра изображения в JFrame. Я загружаю его из файла с ImageIcon.Как вы устанавливаете границы JLabel в JFrame?

JFrame frame = new JFrame(String); 
frame.setLocationByPlatform(true); 
frame.setSize(500, 500); 
frame.setResizable(false); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel cpu = new JLabel(new ImageIcon(String)); 
cpu.setLocation(20, 20); 
cpu.setSize(20, 460); 
frame.add(cpu); 
frame.setVisible(true); 

Я не могу установить расположение и размер JLabel, потому что это делается автоматически.

я должен вручную установить эти значения, потому что я хочу усечь изображение (вертикальный индикатор).

+0

Попробуйте найти [здесь] (http://stackoverflow.com/questions/1783793/java-difference-between-the-setpreferredsize-and-setsize-methods-in-compone). Кроме того, если 'String' является переменной, переименование -' string'. – user1803551

+0

@ user1803551 Я использовал 'String' для представления общего строкового значения. –

+2

Размер этикетки должен быть размером изображения. Какой смысл вручную устанавливать размер вашего ярлыка? Картина изображения не растягивается/сжимается, поэтому у вас будет пустое место на этикетке или усеченное изображение. – camickr

ответ

1

LayoutManager автоматически настраивает ваши компоненты, не позволяя изменять размер вручную.

Если вы хотите уйти от этого, вы можете turn off the LayoutManager.

frame.setLayout(null); 

Пожалуйста, обратите внимание, что вы не должны использовать null макет.

+3

избегают использования нулевого макета. Вместо этого используйте Layout Managers – Frakcool

+1

Этот код не изменяет размер изображения. Он обрезает изображение.Размер исходного изображения (58 x 510). Поэтому вы отсекаете нижнюю часть изображения, а это означает, что вы теряете этот цвет радуги. Swing не был предназначен для использования с нулевым макетом, и, конечно, нет причин использовать нулевой макет. – camickr

+0

@camickr ... и мы все любим зеленый. Я измерил те же размеры, хотя, если я наводил указатель мыши на файл, я получаю подсказку «Размеры: 259x194» в Windows. Не уверен, что он на самом деле измеряет. – user1803551

5

Одним из способов является просто раскрасит изображение:

final ImageIcon icon = new ImageIcon(path); 
JPanel panel = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(icon.getImage(), 0, 0, getWidth(), getHeight(), this); 
    } 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(500, 500); 
    } 
}; 
frame.add(panel); 

getWidth() и getHeight() в drawImage заставит изображение растянуть размер панели. Также getPreferredSize() придаст размер панели.

Если вы хотите, чтобы панель оставалась того размера, убедитесь, что в родительском контейнере есть менеджер компоновки, который будет уважать предпочтительные размеры, например FlowLayout или GridBagLayout. Если вы хотите, чтобы панель растягиваться, то убедитесь, что это родительский контейнер имеет менеджер компоновки, который пренебрегает предпочтительный размер, как BorderLayout или GridLayout

+0

Я спросил об управлении 'JLabel', почему вы используете' JPanel'? –

+0

Если вы хотите, вы можете использовать JLabel и делать то же самое. Я бы предпочел нарисовать на панели. Они оба контейнера и работают одинаково. Просто JLabel имеет больше возможностей. В коде просто измените 'JPanel' на 'JLabel'. Это тот же результат. Если вы используете JLabel и хотите добавить к нему компоненты (например, панель), продолжайте, вот для чего нужны контейнеры. Вам просто нужно установить диспетчер компоновки для метки –

+0

Это не моя проблема: если я использую 'JLabel' или я переопределяю' JPanel', это не имеет значения. ** Я не могу установить размер и расположение элемента управления. ** –

4

Размер вашего оригинала (58 х 510). Если вы хотите отобразить изображение с фиксированным размером 20 x 420, тогда вы должны масштабировать изображение до этого размера, чтобы вы не урезали изображение. Один из способов сделать это - использовать метод Image.getScaledImage(...). Затем вы просто добавляете масштабированное изображение в метку.

Если вы хотите поместить свою метку (20, 20) в верхнем левом углу панели, вы можете добавить EmptyBorder к панели или этикетке.

Используйте функции Swing.

Edit:

Я хочу, чтобы отсечь изображение

Прочитайте изображение в BufferedImage. Затем вы можете использовать метод getSubImage(...), чтобы получить изображение любого размера, который вы хотите. Затем вы можете использовать суб изображение для создания ImageIcon и добавить его к ярлыку.

+0

Изображение не имеет значения. Я всегда не могу установить размер и расположение элемента управления. –

+0

@Joiner, 'Я всегда не могу установить размер и расположение элемента управления.« Точно, вы не должны пытаться вручную установить размер/расположение компонента. Пусть менеджер компоновки сделает это, и он будет работать на всех платформах. – camickr

+0

** Я хочу ** установить эти значения. –

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