Java: JProgressBar (или эквивалентный) в заголовке вкладки JTabbedPane

Если я действительно хотел сделать что-то как этот, я могу поместить JProgressBar (или это эквивалентно) на вкладке JTabbedPane? (Я имею в виду, не на самой вкладке,

Как я сделал бы что-то как этот?

ОТРЕДАКТИРУЙТЕ я действительно хочу поместить progressbar в заголовок вкладки, не самой вкладки.

Вот некоторое искусство ASCII:

----------------------------------------------------
|  Tab 1  || Tab   2||Tab-with-progress-bar||Tab  4|
-----------         --------------------------------
'                                                  '
'                                                  '
'                                                  '
'                                                  '
'                                                  '
'                                                  '
'                                                  '
'                                                  '
----------------------------------------------------

Таким образом, это - действительно "вкладка 2", которая в настоящее время видима, но я хочу, чтобы индикатор выполнения (или эквивалентный) был видим в заголовке третьей вкладки.

РЕДАКТИРОВАНИЕ 2

Это должно работать над Java 1.5: это должно работать над бесчисленным MacOS 10.4 и компьютерами Apple MacOS 10.5, которые никогда не будут оборудоваться Java 6 (некоторые делают, некоторые не делают: и довольно много никогда не будет, это не быть моим вызовом),

10
задан NoozNooz42 14 August 2010 в 15:02
поделиться

2 ответа

Вложите панель JProgressbar в JPanel и добавьте эту JPanel в JTabbedPane.

Изменить: Из JTabbedPane JavaDoc :

// В этом случае пользовательский компонент несет ответственность за предоставление заголовок вкладки.

tabbedPane.addTab(null, myComponent); 
tabbedPane.setTabComponentAt(0, new JLabel("Tab"));

Таким образом, вы можете просто заменить new JLabel ("Tab") ссылкой на вашу панель JProgressbar (хотя эту панель JProgressbar нельзя добавлять к самой вкладке). Однако я думаю, что этот метод не существует до Java 1.6.

4
ответ дан 3 December 2019 в 20:02
поделиться

Для более ранних версий вы можете попробовать addTab () с подходящей реализацией Icon , используемой для индикации прогресса.

JTabbedTest

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class JTabbedTest {

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

            private final JTabbedPane jtp = new JTabbedPane();

            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                jtp.setPreferredSize(new Dimension(400, 200));
                createTab("Reds", Color.RED);
                createTab("Greens", Color.GREEN);
                createTab("Blues", Color.BLUE);

                f.add(jtp, BorderLayout.CENTER);
                f.pack();
                f.setVisible(true);
            }

            private void createTab(String name, Color color) {
                ProgressIcon icon = new ProgressIcon(color);
                jtp.addTab(name, icon, new ColorPanel(jtp, icon));
            }
        });
    }

    private static class ColorPanel extends JPanel implements ActionListener {

        private static final Random rnd = new Random();
        private final Timer timer = new Timer(1000, this);
        private final JLabel label = new JLabel("Stackoverflow!");
        private final JTabbedPane parent;
        private final ProgressIcon icon;
        private final int mask;
        private int count;

        public ColorPanel(JTabbedPane parent, ProgressIcon icon) {
            super(true);
            this.parent = parent;
            this.icon = icon;
            this.mask = icon.color.getRGB();
            this.setBackground(icon.color);
            label.setForeground(icon.color);
            this.add(label);
            timer.start();
        }

        public void actionPerformed(ActionEvent e) {
            this.setBackground(new Color(rnd.nextInt() & mask));
            this.icon.update(count += rnd.nextInt(8));
            this.parent.repaint();
        }
    }

    private static class ProgressIcon implements Icon {

        private static final int H = 16;
        private static final int W = 3 * H;
        private Color color;
        private int w;

        public ProgressIcon(Color color) {
            this.color = color;
        }

        public void update(int i) {
            w = i % W;
        }

        public void paintIcon(Component c, Graphics g, int x, int y) {
            g.setColor(color);
            g.fillRect(x, y, w, H);
        }

        public int getIconWidth() {
            return W;
        }

        public int getIconHeight() {
            return H;
        }
    }
}
15
ответ дан 3 December 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: