Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-添加图标或文本时标签宽度是否更改?_Java_Swing_Size_Scale_Jlabel - Fatal编程技术网

Java Swing-添加图标或文本时标签宽度是否更改?

Java Swing-添加图标或文本时标签宽度是否更改?,java,swing,size,scale,jlabel,Java,Swing,Size,Scale,Jlabel,相同的问题,不同的背景 我以前似乎接受得太匆忙了,因为问题仍然存在。问题出在哪里?JLabel在向其父面板添加内容时可以自由扩展它的父面板 是时候用“装满鳗鱼的气垫船”来复制它了——ses建议,这里是: import java.awt.*; import javax.swing.*; public class TestLabel { public static void main(String[] args) { // Var inits JFrame

相同的问题,不同的背景

我以前似乎接受得太匆忙了,因为问题仍然存在。问题出在哪里?JLabel在向其父面板添加内容时可以自由扩展它的父面板

是时候用“装满鳗鱼的气垫船”来复制它了——ses建议,这里是:

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个像素),同时还会挤压左边缘(绿色)。有人知道为什么会这样吗

我尝试了几件过于冗长而无法解释的事情,但没有发现问题:-/


Java swing对我来说已经很老了,但如果我记得清楚的话,设置首选大小(setPreferredSize())有时可以解决此类问题。。。还可以使用setMaximumSize和setMinimumSize尝试顶部布局

您可以在java文档中找到更多信息:


问候

组件扩展是因为它为其
图标分配了必要的空间



以下内容输出到控制台:

Empty label dimensions - java.awt.Dimension[width=0,height=0]
Text only label dimensions - java.awt.Dimension[width=129,height=16]
Image width: 194, Image height: 180
Text and image label dimensions - java.awt.Dimension[width=363,height=180]

考虑使用JLayeredPane在层中添加组件。不过,在不透明度、添加组件的大小和位置等方面进行此操作时,会出现绊倒和陷阱

比如说,

import java.awt.*;
import javax.swing.*;

public class TestLabel {
   private static final Dimension SIZE = new Dimension(800, 600);

   public static void main(String[] args) {
      GridBagConstraints gbc = new GridBagConstraints();


      JPanel defaultPane = new JPanel();
      defaultPane.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;
      JPanel panel = new JPanel();
      panel.setBackground(Color.GREEN);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.7;
      gbc.gridx = 1;
      gbc.gridy = 0;
      panel = new JPanel();
      panel.setBackground(Color.RED);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.3;
      gbc.gridx = 0;
      gbc.gridy = 1;
      panel = new JPanel();
      panel.setBackground(Color.BLUE);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.7;
      gbc.gridx = 1;
      gbc.gridy = 1;
      panel = new JPanel();
      panel.setBackground(Color.YELLOW);
      defaultPane.add(panel, gbc);
      defaultPane.setSize(SIZE);

      JLabel label = new JLabel("THE PANEL IS NOW DISTORTED TO FIT THIS LABEL WHY IS THIS HAPPENING");
      label.setOpaque(true);
      label.setBackground(Color.WHITE);

      JPanel northPalettePanel = new JPanel();
      northPalettePanel.setOpaque(false);
      northPalettePanel.add(label);

      JPanel palettePanel = new JPanel(new BorderLayout());
      palettePanel.setOpaque(false);
      palettePanel.setSize(SIZE);
      palettePanel.setLocation(0, 0);
      palettePanel.add(northPalettePanel, BorderLayout.NORTH);

      JLayeredPane layeredPane = new JLayeredPane();
      layeredPane.setPreferredSize(SIZE);
      layeredPane.add(defaultPane, JLayeredPane.DEFAULT_LAYER);
      layeredPane.add(palettePanel, JLayeredPane.PALETTE_LAYER);

      JFrame frame = new JFrame("Label Tester");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(layeredPane, BorderLayout.CENTER);
      frame.pack();

      frame.setVisible(true);
   }
}

这是正常的行为。@Op.你在使用什么layoutmanager?@Kaj-GridBagLayout,我很确定我的权重是正确的。如果你能提供一个最小的可编译代码示例来重复演示这个问题,那我们就最好了。@Moonbeam-很高兴知道,但我该怎么做?@Moonbeam。什么意思?JLabel如何调整大小的行为取决于放置JLabel的组件所使用的layoutmanager。@装满鳗鱼的气垫船,也许我只是被这个问题弄糊涂了。当您将
图标
添加到
JLabel
时,组件将根据文本和图像尺寸调整自身大小,不是吗?啊啊啊啊啊啊啊哈,谢谢,这看起来是个赢家。顺便说一句,你对图像和动画GIF有着最高的品味。
import java.awt.*;
import javax.swing.*;

public class TestLabel {
   private static final Dimension SIZE = new Dimension(800, 600);

   public static void main(String[] args) {
      GridBagConstraints gbc = new GridBagConstraints();


      JPanel defaultPane = new JPanel();
      defaultPane.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;
      JPanel panel = new JPanel();
      panel.setBackground(Color.GREEN);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.7;
      gbc.gridx = 1;
      gbc.gridy = 0;
      panel = new JPanel();
      panel.setBackground(Color.RED);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.3;
      gbc.gridx = 0;
      gbc.gridy = 1;
      panel = new JPanel();
      panel.setBackground(Color.BLUE);
      defaultPane.add(panel, gbc);

      gbc.weightx = 0.7;
      gbc.gridx = 1;
      gbc.gridy = 1;
      panel = new JPanel();
      panel.setBackground(Color.YELLOW);
      defaultPane.add(panel, gbc);
      defaultPane.setSize(SIZE);

      JLabel label = new JLabel("THE PANEL IS NOW DISTORTED TO FIT THIS LABEL WHY IS THIS HAPPENING");
      label.setOpaque(true);
      label.setBackground(Color.WHITE);

      JPanel northPalettePanel = new JPanel();
      northPalettePanel.setOpaque(false);
      northPalettePanel.add(label);

      JPanel palettePanel = new JPanel(new BorderLayout());
      palettePanel.setOpaque(false);
      palettePanel.setSize(SIZE);
      palettePanel.setLocation(0, 0);
      palettePanel.add(northPalettePanel, BorderLayout.NORTH);

      JLayeredPane layeredPane = new JLayeredPane();
      layeredPane.setPreferredSize(SIZE);
      layeredPane.add(defaultPane, JLayeredPane.DEFAULT_LAYER);
      layeredPane.add(palettePanel, JLayeredPane.PALETTE_LAYER);

      JFrame frame = new JFrame("Label Tester");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(layeredPane, BorderLayout.CENTER);
      frame.pack();

      frame.setVisible(true);
   }
}