2017-04-22 22 views
0

我创建了一个包含ImageIconJLabel,并在将其平滑到首选大小之后,将其插入到具有网格布局的JFrame中。JLabel ImageIcon没有正常平滑

它主要工作,但因为看到了这个图像中的JLabel围绕坯料水平区域挤兑了大部分的框架:Outcome

为什么JLabelImageIcon不给我下面的结果?

Desired Outcome

这是我的渲染器:

 ImageIcon imageIcon = new ImageIcon(baseDir + dash + "ErrIco.png"); 
     Image image = imageIcon.getImage(); 
     Image newimg = image.getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH); 
     imageIcon = new ImageIcon(newimg); 
+1

1)为了更好地帮助更快,发布[MCVE]或[短的,独立的,正确的示例](HTTP:// www.sscce.org/)。 2)获取图像的一种方法是通过[本问答](http://stackoverflow.com/q/19209650/418556)中的图像进行热链接。 –

+1

*“这是要求它是一个很好的问题..”*这是相当主观的。我会说是的。 *“或者只是建议?”*我会说这是两个。 OTOH没有一个,但**两个**提到'没有MCVE'的密切理由,所以你应该问自己的问题是,你想要多少答案?我几乎想把这个不可编译的代码片段变成一个MCVE进一步测试,但现在我想我会等待你的决定(&MCVE)。 –

回答

3

尝试使用不同的布局,像BorderLayoutGridLayout将强制所有单元具有相同的大小。

frame.setLayout(new BorderLayout()); 
... 
frame.add(new JLabel(imageIcon), BorderLayout.WEST); 
frame.add(label,     BorderLayout.CENTER); 

编辑:

我看你已经接受了我的答案,但我在平均时间把这个在一起,只是为了看看有缩放图像的JLabel增加了一些额外的因素。 (。它没有它工作正常)

image example

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

class ImageExample implements Runnable { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new ImageExample()); 
    } 

    @Override 
    public void run() { 
     JFrame frame = new JFrame(); 
     JPanel content = new JPanel(); 
     content.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     content.setBackground(Color.white); 
     frame.setContentPane(content); 
     // 
     frame.setLayout(new BorderLayout(20, 20)); 
     JLabel icon = new JLabel(new ImageIcon(img)); 
     JLabel text = new JLabel("<html>" + 
      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "<br>" + 
      "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "<br>" + 
      "cccccccccccccccccccccccccccccccccccccccccc" + "</html>"); 
     text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); 
     frame.add(icon, BorderLayout.WEST); 
     frame.add(text, BorderLayout.CENTER); 
     // 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static final Image img; 
    static { 
     try { 
      URL url = new URL("http://i.stack.imgur.com/7bI1Y.jpg"); 
      img = ImageIO.read(url).getScaledInstance(48, 48, Image.SCALE_SMOOTH); 
     } catch (Exception x) { 
      throw new RuntimeException(x); 
     } 
    } 
} 
+0

这实际上工作! :哦,谢谢! :D –

+0

'FlowLayout'也可能工作。我把一个MCVE放在一起,所以我加了一个好的措施。 – Radiodef

+0

我想过使用Flow,但我希望图标位于文本左侧,Flow会使图标下方显示一些文本。 –