2011-07-25 11 views
2

同じ質問、異なる文脈Java Swing - アイコンまたはテキストを追加するとJLabelの幅が変更されましたか?

問題がまだあるので、私は、私が前に受け入れることで、あまりにも性急だったようです。問題? 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); 
    } 
} 

結果:緑、あなたが見ることができるよう

enter image description here

パネルが広げられ、テキスト(または、元の質問とアイコンの中に)が追加されると、私のレイアウト全体が捨てられます。コンテンツに関係なく、私のレイアウトが同じウェイトを維持したい。私が元の質問に見られるように、ラベルにアイコンとして拡大縮小画像を追加しようとしているためです。

ちなみに、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); 

あなたが最初picから見ることができるように、私は私がやろうとしているどのような幅Wのラベル(赤)を持っていることに、私のアイコンを伸ばしています幅Wとラベルに入れてください。

私はこれを行う、ラベルは膨張(正確に50ピクセルで、私は思う)し、また、左エッジ(緑)の上に絞り出します。なぜ誰が何が起こっているのか分かりませんか?

私が説明するのはあまりにも冗長ではありますが、問題を見つけることができないいくつかのことを試してみた

: -/

enter image description here

+0

これは正常な動作です。 – Moonbeam

+0

@Op。どのレイアウトマネージャーを使用していますか? – Kaj

+0

@ Kaj - GridBagLayout、そして私は私の重み付けが正しいと確信しています。 – Ben

答えて

3

あなたのコンポーネントが展開されます。


public class JLabelDemo { 
    private static BufferedImage bi; 

    public static void main(String[] args) throws IOException{ 
     loadImage(); 

     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       createAndShowGUI();    
      } 
     }); 
    } 

    private static void loadImage() throws IOException{ 
     bi = ImageIO.read(JLabelDemo.class.getResource("../resource/forever-alone.jpg")); 
    } 

    private static void createAndShowGUI(){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel panel = new JPanel(); 
     panel.setBackground(Color.YELLOW); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     final JLabel emptyLabel = new JLabel(); 
     final JLabel textLabel = new JLabel("This label has text only"); 
     final JLabel textAndImageLabel = new JLabel("This label has text and image"); 
     textAndImageLabel.setIcon(new ImageIcon(bi)); 

     panel.add(emptyLabel); 
     panel.add(textLabel); 
     panel.add(textAndImageLabel); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     System.out.println("Empty label dimensions - " + emptyLabel.getSize()); 
     System.out.println("Text only label dimensions - " + textLabel.getSize()); 
     System.out.println("Image width: " + bi.getWidth() + ", Image height: " + bi.getHeight()); 
     System.out.println("Text and image label dimensions - " +textAndImageLabel.getSize()); 
    } 
} 

enter image description here


以下がコンソールに出力される。

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] 
+1

Ahhhhahaha美しいこれは勝者のように見えます。あなたはイメージやアニメーションGIFで最上級の味を持っています。前方および上方。 – Ben

+1

とてもいいポテト+1 – mKorbel

1

Javaのスイングは、私にとってはかなり古いですが、私はよく覚えている場合、設定推奨サイズ(setPreferredSize())これらの種類の問題を解決することもあります... setMaximumSizeとsetMinimumSizeでトップレイを試してください。

あなたは多分Javaドキュメントでより多くの情報を見つけることができます。 http://download.oracle.com/javase/tutorial/uiswing/layout/using.html#sizealignment

よろしく!それはそのIconに必要なスペースを割り当てているため

+1

@ムーンビーム。どういう意味ですか? JLabelのサイズ変更の動作は、JLabelが配置されているコンポーネントによって使用されるlayoutmanagerによって異なります。 – Kaj

+0

@Hovercraft Eelsの完全な、たぶん私は疑問に混乱しています。 'JLabel'に' Icon'を追加すると、コンポーネントはテキストと画像の次元に応じてサイズ変更されます。 – Moonbeam

2

は層にコンポーネントを追加するの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); 
    } 
} 
関連する問題