JTabbedPane: изменить размер вкладки при изменении заголовка вкладки - PullRequest
1 голос
/ 20 февраля 2012

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

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

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

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

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

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

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

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

Спасибо и высоко ценим!

1 Ответ

2 голосов
/ 20 февраля 2012

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

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

Swing однопоточный и все изменения в Swing GUI должныбыть сделано в ветке рассылки событий, больше об этой теме в Concurency в 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();
            }
        });
    }
}
...