Тот же вопрос, другой контекст
Кажется, я был слишком поспешен в принятии ранее, так как проблема все еще существует. Эта проблема? JLabel может свободно расширять родительскую панель при добавлении в нее контента.
Пришло время воспроизвести его согласно предложению "Судно на воздушной подушке с угрями", и вот оно:
import java.awt.*;
import javax.swing.*;
public class TestLabel {
public static void main(String[] args) {
// Var inits
JFrame frame;
JPanel panel;
JLabel label;
Container pane;
GridBagConstraints gbc = new GridBagConstraints();
// Frame, content pane, layout inits
frame = new JFrame("Label Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pane = frame.getContentPane();
pane.setLayout(new GridBagLayout());
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
// Add panels (note gbc weighty and fill carries over all instances)
gbc.weightx = 0.3;
gbc.gridx = 0;
gbc.gridy = 0;
panel = new JPanel();
panel.setBackground(Color.GREEN);
frame.add(panel,gbc);
label = new JLabel("THE PANEL IS NOW DISTORTED TO FIT THIS LABEL WHY IS THIS HAPPENING");
//label = new JLabel("");
label.setOpaque(true);
label.setBackground(Color.WHITE);
panel.add(label);
gbc.weightx = 0.7;
gbc.gridx = 1;
gbc.gridy = 0;
panel = new JPanel();
panel.setBackground(Color.RED);
frame.add(panel,gbc);
gbc.weightx = 0.3;
gbc.gridx = 0;
gbc.gridy = 1;
panel = new JPanel();
panel.setBackground(Color.BLUE);
frame.add(panel,gbc);
gbc.weightx = 0.7;
gbc.gridx = 1;
gbc.gridy = 1;
panel = new JPanel();
panel.setBackground(Color.YELLOW);
frame.add(panel,gbc);
frame.pack();
frame.setSize(800,600);
frame.setVisible(true);
}
}
Результаты:
Как видите, зеленая панель становится шире и отбрасывает весь макет, когда к нему добавляется текст (или, в исходном вопросе, и значок). Я хочу, чтобы мой макет оставался одинаковым по весу независимо от содержимого. Причина, по которой это возникло, заключается в том, что я пытаюсь добавить масштабированное изображение в виде значка на ярлык, как видно из исходного вопроса.
Кстати, setPreferredSize()
, похоже, не работает.
Есть ли способ это исправить?
Оригинальный вопрос
Мой элемент JLabel значительно расширяется, когда я добавляю в него иконку. Почему это происходит? Вот соответствующая часть кода:
// Show label and BG color
redLabel.setBackground(Color.RED);
redLabel.setOpaque(true);
// Grab stretched image (already loaded elsewhere in the code) and turn to icon
Img = Img.getScaledInstance(redLabel.getWidth(),12,Image.SCALE_REPLICATE);
ImageIcon icon = new ImageIcon(Img);
// This line throws everything off!
//It's commented out in the first pic, and included in the second.
redLabel.setIcon(icon);
Как вы можете видеть из первого рисунка, у меня есть метка (красного цвета) шириной W. Я пытаюсь растянуть иконку до ширины W и поместить ее в метку.
Когда я это делаю, метка расширяется (я думаю, ровно на 50 пикселей), а также сжимается по левому краю (зеленый). Кто-нибудь знает, почему это происходит?
Я пробовал несколько вещей, которые слишком многословны, чтобы объяснить, но не могу найти проблему: - /