Java: JProgressBar (или эквивалент) в заголовке вкладки JTabbedPane
Если бы я действительно хотел сделать что-то подобное, могу ли я поместить JProgressBar (или его эквивалент) на вкладку JTabbedPane? (Я имею в виду не в самой вкладке,
Как мне сделать что-то подобное?
EDIT Я действительно хочу поместить индикатор прогресса в заголовок вкладки, а не вкладку.
Вот некоторые аськи:
----------------------------------------------------
| Tab 1 || Tab 2||Tab-with-progress-bar||Tab 4|
----------- --------------------------------
' '
' '
' '
' '
' '
' '
' '
' '
----------------------------------------------------
Итак, это действительно "вкладка 2", которая в настоящее время видима, но я хочу, чтобы индикатор выполнения (или эквивалент) был видимым на третьей вкладке title.
РЕДАКТИРОВАТЬ 2
Это должно работать на Java 1.5: это должно работать на бесчисленных компьютерах MacOS 10.4 и MacOS 10.5 Apple, которые никогда не будут оснащены Java 6 (некоторые из них, а некоторые нет: и довольно много никогда не будет, это это не мой звонок)
Ответы
Ответ 1
Закройте JProgressbar в JPanel и добавьте JPanel в JTabbedPane.
Изменить: Из JTabbedPane JavaDoc:
//В этом случае пользовательский компонент несет ответственность за название вкладки.
tabbedPane.addTab(null, myComponent);
tabbedPane.setTabComponentAt(0, new JLabel("Tab"));
Таким образом, вы могли бы просто заменить new JLabel("Tab")
ссылкой на ваш JProgressbar (хотя этот JProgressbar не должен быть добавлен к самой вкладке).
Тем не менее, я думаю, что этот метод не существует до Java 1.6.
Ответ 2
Для более ранних версий вы можете попробовать 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;
}
}
}