2015-07-14 2 views
3

У меня есть JLabel. Код для JLabel выглядит следующим образом.Как изменить размер JLabel при изменении размера шрифта?

panelmain = new JPanel(); 
panelmain.setLayout(null); 
panelmain.setPreferredSize(new java.awt.Dimension(800, 600)); 
panelmain.addComponentListener(listen); 
panelmain.setBorder(null); 
titlebar = new JLabel("Hello World"); 
titlebar.setBounds(10, 10, 100, 30); 
panelmain.add(titlebar); 

Мой квестинг, что если я изменить шрифт titlebar (т.е. JLabel), то, как изменить размер (который уже установлен в коде, как titlebar.setBounds(10, 10, 100, 30);) из titlebar?

Редактируйте Гириш

Мой полный код, как показано ниже.

import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 

import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class IFrame extends JInternalFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 6526561589695424088L; 

    private JScrollPane jsp; 

    private IFListen listen; 

    private JPanel panelmain; 

    protected JPanel panel; 

    private String title; 

    private JLabel titlebar; 

    public IFrame() 
    { 
     this.title=""; 
     init(); 
    } 

    public IFrame(String title) 
    { 
     this.title=title; 
     init(); 
    } 

    private void init() 
    { 
     setLayout(null); 

     listen=new IFListen(); 
     panelmain=new JPanel(); 
      panelmain.setLayout(null); 
      panelmain.setPreferredSize(new java.awt.Dimension(800, 600)); 
      panelmain.addComponentListener(listen); 
      panelmain.setBorder(null); 

      titlebar=new JLabel("Hello World"); 
      titlebar.setFont(new java.awt.Font("Monotype Corsiva", 1, 48)); 
      panelmain.add(titlebar); 

      panel=new JPanel(); 
      panel.setBorder(javax.swing.BorderFactory.createTitledBorder(title)); 
      panel.setMinimumSize(new java.awt.Dimension(400, 400)); 
      panel.setSize(400, 400); 
      panelmain.add(panel); 

     jsp=new JScrollPane(panelmain); 
     jsp.setBorder(null); 

     add(jsp); 

     this.addComponentListener(listen); 
    } 

    //INFO Custom Methods 
    public void setTitleFont(java.awt.Font font) 
    { 
     titlebar.setFont(font); //Here I want to change size of label. 
    } 

    //INFO Listener Class for IFrame 
    private class IFListen implements ComponentListener 
    { 
     //INFO Overridden Methods 
     @Override 
     public void componentResized(ComponentEvent e) 
     { 
      if(e.getSource() instanceof IFrame) 
       jsp.setBounds(5, 5, getWidth()-20, getHeight()-20); 
      else if(e.getSource()==panelmain) 
      { 
       panel.setLocation(Integer.parseInt(panelmain.getWidth()/2-panel.getWidth()/2+""), 0); 
      } 
     } 

     //INFO Unimplemented Methods 
     @Override 
     public void componentShown(ComponentEvent arg0) {} 

     @Override 
     public void componentHidden(ComponentEvent arg0) {} 

     @Override 
     public void componentMoved(ComponentEvent arg0) {} 
    } 
} 

Я прокомментировал, где изменяется размер шрифта, и я хочу изменить размер jlabel.

+1

Не использовать setBounds? JLabel будет изменять размер при изменении шрифта. – Gosu

+0

Я попробую и скоро вернусь, спасибо за ответ @Gosu – Girish

+8

Теперь у вас есть конкретные примеры того, почему вы не должны позиционировать элементы абсолютно, но вместо этого используйте диспетчер компоновки. Менеджер компоновки позаботится об этом. –

ответ

3

Не используйте setPreferredSize, вы только что удалили все вычисления, которые использует метка, чтобы рассчитать размер, которым он хотел бы быть.

Избегайте использования макетов null, идеальные макеты пикселей являются иллюзией в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбрасывая их, что не приведет к проблемам и проблемам, которые вы потратите все больше времени на исправление.

Используйте соответствующие макеты. Важно то, что ни один макет никогда не сделает все, что вы хотите. Вам нужно будет научиться использовать преимущества каждого макета (и недостатки) и использовать их в своих интересах. Это то, что обычно называют «составными макетами». Посмотрите Laying Out Components Within a Container для получения более подробной информации и идей

Resizable label

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel label; 
     private JSlider slider; 

     public TestPane() { 
      label = new JLabel("Look, no hands!"); 
      setLayout(new BorderLayout()); 
      JPanel panel = new JPanel(new GridBagLayout()); 
      panel.add(label); 

      add(panel); 

      slider = new JSlider(8, 96); 
      add(slider, BorderLayout.SOUTH); 

      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        Font font = label.getFont(); 
        font = font.deriveFont((float)slider.getValue()); 
        label.setFont(font); 
       } 
      }); 
      slider.setValue(8); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 

    } 

} 

JLabel удивительно опытный, изменение шрифта (текст/значок) будет автоматически привести к его недействительности структуры и запросить перекрасить все само по себе ...

+0

Получил! Я должен использовать макет согласно требованию. Благодарю. – Girish

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

  • Нет связанных вопросов^_^