2012-02-20 7 views
1

У меня есть JTabbedPane myTab внутри моего JFrame. Его первая вкладка имеет название «старое название». Я хочу изменить название динамически, поэтому я использую этот код, чтобы установить:JTabbedPane: изменить размер вкладки при изменении вкладки вкладки

myTab.setTitleAt(myTab.getSelectedIndex(), "my full new title"); 

И как-то мой новый титул больше, чем мой старый друг. Проблема в том, что размер вкладок не изменяется, и он не отображает новый заголовок полностью, только «мой полный n ...».

И если я нажму на вкладку, то на вкладке появится полный новый заголовок.

Я уже попробовал этот код тоже, чтобы установить имя название:

myTab.setTabComponentAt(myTab.getSelectedIndex(), new JLabel("my full new title")); 

Этот код может помочь мне изменить размер табуляции соответственно на новое название. Но крест (x), чтобы закрыть вкладку, больше не существует.

Кто-нибудь знает, как изменить размер вкладки при изменении названия вкладки, но все-таки сохранить опцию закрытия вкладки?

Спасибо и очень ценю!

ответ

2

Я никогда не видел, что

, но это возможно только в одном случае, код, который вы бежите вне EDT,

Качели однопоточен и все изменения в графический интерфейс свинга должны быть сделаны Событие отправка Thread, больше об этой теме в Concurency in Swing, (я предлагаю искать эту общую тему на этом форуме),

enter image description hereenter image description here

из кода,

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DecimalFormat; 
import java.util.Random; 
import javax.swing.*; 

/*based on @trashgod code original code 
@see http://stackoverflow.com/questions/5617027 */ 
public class Cab extends JPanel { 

    private static final Random random = new Random(); 
    private static final String format = "00000000"; 
    private static final DecimalFormat df = new DecimalFormat(format); 
    private static JTabbedPane tabbedPane = new JTabbedPane(); 
    private static final long serialVersionUID = 1L; 
    private Hue hue = Hue.Yellow; 
    private Timer timer; 
    private JLabel odometer = new JLabel(df.format(0)); 
    private int km; 

    public Cab() { 
     this.setPreferredSize(new Dimension(320, 240)); 
     this.setBackground(hue.getColor()); 
     this.add(odometer); 
     final JComboBox colorBox = new JComboBox(); 
     for (Hue h : Hue.values()) { 
      colorBox.addItem(h); 
     } 
     colorBox.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Hue h = (Hue) colorBox.getSelectedItem(); 
       Cab.this.setBackground(h.getColor()); 
       tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), "my full new title"); 
      } 
     }); 
     this.add(colorBox); 
     timer = new Timer(250, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       km += random.nextInt(100); 
       odometer.setText(df.format(km)); 
      } 
     }); 
     timer.start(); 
    } 

    private enum Hue { 

     Yellow(Color.yellow), Cyan(Color.cyan), Magenta(Color.magenta); 
     private final Color color; 

     private Hue(Color color) { 
      this.color = color; 
     } 

     public Color getColor() { 
      return color; 
     } 
    } 

    private static void display() { 
     JFrame f = new JFrame("Dispatch"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     tabbedPane.add("Cab #1", new Cab()); 
     tabbedPane.add("Cab #2", new Cab()); 
     tabbedPane.add("Cab #3", new Cab()); 
     f.add(tabbedPane); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 
} 
+0

Спасибо. Я выяснил, что моя проблема заключается в том, что Im использует мой собственный класс, расширяя JPanel, чтобы создать компонент вкладки с крестом: ButtonTabComponent расширяет JPanel(); setTabComponentAt (индекс, новый ButtonTabComponent (this)); и мой ButtonTabComponent не реализуют функцию updateUI – baizen

+1

Мое решение: ((ButtonTabComponent) myTab.getTabComponentAt (myTab.getSelectedIndex())). UpdateUI(); – baizen

+0

лучше один раз посмотреть, как .... – mKorbel

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