Hallo zusammen,
ich habe nochmal ein Problem mit einer JTabbedPane.
Das Beispiel habe ich mir bei Sun angeguckt und es fuer meinerApplikation umgebaut.
Allerdings habe ich das Problem, dass ich einen Tab eindeutig mit einer ID versehen moechte.
How to? Verzweifel so langsam bei dem Versuch zu identifizieren, welcher Tab geschlossen wurde.
#getTabComponentAt() liefert mir die aktuelle Position. Wird ein Tab geschlossen, rueckt ein anderes Tab an dessen Position.
#getSelected bringt mir auch nichts, da man einen Tab auch schliessen kann, ohne dass dieser gerade den Focus hat.
HIer mal ein wenig lauffaehiger "Testcode" um das Problem etwas besser zu verdeutlichen
Waere toll wenn mir jemand dahingehend weiterhelfen koennte mir zu sagen, wie ich einem Tab eben eine eindeutige ID verpasse, die ich von aus mit einem getter abfragen kann.
Vielen DAnk schonmal
ich habe nochmal ein Problem mit einer JTabbedPane.
Das Beispiel habe ich mir bei Sun angeguckt und es fuer meinerApplikation umgebaut.
Allerdings habe ich das Problem, dass ich einen Tab eindeutig mit einer ID versehen moechte.
How to? Verzweifel so langsam bei dem Versuch zu identifizieren, welcher Tab geschlossen wurde.
#getTabComponentAt() liefert mir die aktuelle Position. Wird ein Tab geschlossen, rueckt ein anderes Tab an dessen Position.
#getSelected bringt mir auch nichts, da man einen Tab auch schliessen kann, ohne dass dieser gerade den Focus hat.
HIer mal ein wenig lauffaehiger "Testcode" um das Problem etwas besser zu verdeutlichen
Code:
package temp;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import com.daap.gui.*;
/*
* Creating and using TabComponentsDemo example
*/
public class TabComponentsDemo extends JFrame
implements ActionListener
{
private final int tabNumber = 5;
private final JTabbedPane pane = new JTabbedPane();
private JMenuItem tabComponentsItem;
private JMenuItem scrollLayoutItem;
private JMenuItem newTabItem;
private TestPanel panel;
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable(){
public void run(){
//Turn off metal's use of bold fonts
//UIManager.put("swing.boldMetal", Boolean.FALSE);
String lookAndFeel = null;
lookAndFeel = UIManager.getSystemLookAndFeelClassName();
try
{
UIManager.setLookAndFeel(lookAndFeel);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
new TabComponentsDemo("TabComponentsDemo").runTest();
}
});
}
public TabComponentsDemo(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initMenu();
add(pane);
}
public void runTest() {
pane.removeAll();
for (int i = 0; i < tabNumber; i++) {
String title = "Tab";
this.panel = new TestPanel();
pane.add(title, this.panel);
initTabComponent(i);
}
tabComponentsItem.setSelected(true);
pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
scrollLayoutItem.setSelected(false);
setSize(new Dimension(1024, 768));
setLocationRelativeTo(null);
setVisible(true);
}
private void initTabComponent(int i) {
pane.setTabComponentAt(i,
new ButtonTabComponent(pane, this));
}
//Setting menu
private void initMenu() {
JMenuBar menuBar = new JMenuBar();
//create Options menu
tabComponentsItem = new JCheckBoxMenuItem("Use TabComponents", true);
tabComponentsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.ALT_MASK));
tabComponentsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < pane.getTabCount(); i++) {
if (tabComponentsItem.isSelected()) {
initTabComponent(i);
} else {
pane.setTabComponentAt(i, null);
}
}
}
});
scrollLayoutItem = new JCheckBoxMenuItem("Set ScrollLayout");
scrollLayoutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.ALT_MASK));
scrollLayoutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (pane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT) {
pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
} else {
pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
}
}
});
JMenuItem resetItem = new JMenuItem("Reset JTabbedPane");
resetItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.ALT_MASK));
resetItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
runTest();
}
});
JMenuItem newTabItem = new JMenuItem("neuer Reiter");
newTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.ALT_MASK));
newTabItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
addNewTab();
}
});
JMenu optionsMenu = new JMenu("Options");
optionsMenu.add(tabComponentsItem);
optionsMenu.add(scrollLayoutItem);
optionsMenu.add(resetItem);
optionsMenu.add(newTabItem);
menuBar.add(optionsMenu);
setJMenuBar(menuBar);
}
public void addNewTab(){
int anzTabs = pane.getTabCount();
String ttl = "neuer Reiter (" + anzTabs + ")";
pane.add(ttl, new JLabel(ttl));
initTabComponent(anzTabs);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("HIer wuerde ich gerne Wissen welcher Tab geschlossen wurde");
}
}
Code:
package temp;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.*;
public class ButtonTabComponent extends JPanel {
private final JTabbedPane pane;
public ButtonTabComponent(final JTabbedPane pane, TabComponentsDemo demo) {
//unset default FlowLayout' gaps
super(new FlowLayout(FlowLayout.LEFT, 0, 0));
if (pane == null) {
throw new NullPointerException("TabbedPane is null");
}
this.pane = pane;
setOpaque(false);
//make JLabel read titles from JTabbedPane
JLabel label = new JLabel() {
public String getText() {
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if (i != -1) {
return pane.getTitleAt(i);
}
return null;
}
};
add(label);
//add more space between the label and the button
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
//tab button
JButton button = new TabButton(demo);
add(button);
//add more space to the top of the component
setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
}
private class TabButton extends JButton implements ActionListener {
public TabButton(TabComponentsDemo demo) {
int size = 17;
setPreferredSize(new Dimension(size, size));
setToolTipText("close this tab");
//Make the button looks the same for all Laf's
setUI(new BasicButtonUI());
//Make it transparent
setContentAreaFilled(false);
//No need to be focusable
setFocusable(false);
setBorder(BorderFactory.createEtchedBorder());
setBorderPainted(false);
//Making nice rollover effect
//we use the same listener for all buttons
addMouseListener(buttonMouseListener);
setRolloverEnabled(true);
//Close the proper tab by clicking the button
addActionListener(this);
addActionListener(demo);
}
public void actionPerformed(ActionEvent e) {
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if (i != -1) {
pane.remove(i);
}
}
//we don't want to update UI for this button
public void updateUI() {
}
//paint the cross
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
//shift the image for pressed buttons
if (getModel().isPressed()) {
g2.translate(1, 1);
}
g2.setStroke(new BasicStroke(2));
g2.setColor(Color.BLACK);
if (getModel().isRollover()) {
g2.setColor(Color.MAGENTA);
}
int delta = 6;
g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
g2.dispose();
}
}
private final static MouseListener buttonMouseListener = new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(true);
}
}
public void mouseExited(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(false);
}
}
};
}
Code:
package temp;
import javax.swing.*;
public class TestPanel extends JPanel
{
private JLabel label = new JLabel("Name: ");
private JTextField textfield = new JTextField(30);
public TestPanel()
{
super();
init();
}
private void init()
{
this.add(this.label);
this.add(this.textfield);
this.setVisible(true);
}
}
Waere toll wenn mir jemand dahingehend weiterhelfen koennte mir zu sagen, wie ich einem Tab eben eine eindeutige ID verpasse, die ich von aus mit einem getter abfragen kann.
Vielen DAnk schonmal