2015-05-27 3 views
0

Почему южная панель не появляется для первой вкладки - только для второй?Swing - JTabbedPane - панель не отображается для обеих вкладок

Если я вместо этого называет южную панель() для каждой вкладки, да - появляется южная панель, НО - слушатели не работают (что, я думаю, связано с распределением gui-объектов, таких как кнопки два раза с новыми адресами памяти) ,

Так что - независимо от того, что я делаю, проблема - либо южная панель не появляется, либо она появляется, но обратные вызовы не работают на всех, для первой вкладки.

Любые решения этой

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

public class MyApp extends JFrame implements ActionListener, ItemListener { 

private JTabbedPane pane; 
private JPanel tab1Panel, tab2Panel, centerPanel, southPanel, inputPanel, checkPanel;; 
private JScrollPane scrollPane1, scrollPane2, scrollPane3; 
private JTextArea area1, area2; 
private JButton quit, ok; 
private JCheckBox check; 
private JTextField input; 
private JLabel input_lbl, check_lbl; 

public static void main(String[] args) { 

    new MyApp().setVisible(true); 
} 

public MyApp() { 

    initComp(); 
    setListeners(); 
} 

private void initComp() { 

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    setSize(dim.width/2, dim.height/2); 
    setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2); 

    southPanel(); 

    tab1(); 
    tab2(); 

    pane = new JTabbedPane(); 
    pane.addTab("info om xml", tab1Panel); 
    pane.addTab("rita", tab2Panel); 

    Container contentPane = getContentPane(); 
    contentPane.add(pane); 

    setDefaultCloseOperation(EXIT_ON_CLOSE);  
} 

private void tab1() { 

    area1 = new JTextArea(); 
    area2 = new JTextArea(); 

    scrollPane1 = new JScrollPane(area1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    scrollPane2 = new JScrollPane(area2, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

    centerPanel = new JPanel(new GridLayout(1, 2)); 
    centerPanel.add(scrollPane1); 
    centerPanel.add(scrollPane2); 

    tab1Panel = new JPanel(new BorderLayout()); 
    tab1Panel.add(centerPanel, BorderLayout.CENTER); 
    tab1Panel.add(southPanel, BorderLayout.SOUTH); 
} 

private void tab2() { 

    centerPanel = new JPanel(); 
    centerPanel.add(new JLabel("this is for drawing")); 

    tab2Panel = new JPanel(new BorderLayout()); 
    tab2Panel.add(centerPanel, BorderLayout.CENTER); 
    tab2Panel.add(southPanel, BorderLayout.SOUTH); 
} 

private void southPanel() { 

    ok = new JButton("Ok"); 
    quit = new JButton("Avsluta"); 

    check_lbl = new JLabel("Change"); 
    input_lbl = new JLabel("Document"); 

    input = new JTextField(""); 
    input.setEditable(false); 

    check = new JCheckBox(); 

    inputPanel = new JPanel(new BorderLayout()); 
    inputPanel.add(input_lbl, BorderLayout.WEST); 
    inputPanel.add(input, BorderLayout.CENTER); 

    checkPanel = new JPanel(new BorderLayout()); 
    checkPanel.add(check_lbl, BorderLayout.WEST); 
    checkPanel.add(check, BorderLayout.CENTER); 

    southPanel = new JPanel(new GridLayout(1, 4)); 
    southPanel.add(quit); 
    southPanel.add(ok); 
    southPanel.add(inputPanel); 
    southPanel.add(checkPanel); 
} 

@Override 
public void actionPerformed(ActionEvent aE) { 

    String theEvent = aE.getActionCommand(); 

    if (theEvent.equals("Avsluta")) { 
     System.exit(0); 
    } else if (theEvent.equals("Ok")) { 

     System.out.println("ok!"); 
    } 
} 

@Override 
public void itemStateChanged(ItemEvent iE) { 

    if (iE.getStateChange() == iE.SELECTED) { 
     input.setEditable(true); 
    } else { 
     input.setEditable(false); 
    } 
} 

private void setListeners() { 

    check.addItemListener(this); 
    ok.addActionListener(this); 
    quit.addActionListener(this); 
} 

}

Edit: Может быть, я должен поставить вопрос по-другому - Как я мог бы сделать эти две вкладки одни и те же southPanel?

ответ

2

Как я могу заставить эти две вкладки использовать одну и ту же южную панель?

Короткий ответ: вы не можете. Компонент может находиться только в одном контейнере. Вам нужно будет создать два разных экземпляра вашего southPanel для каждой вкладки

Лучшее решение, будет разделять компоненты на повторно используемые компоненты (т. Е. Сделать southPanel его собственным компонентом) и содержать функциональные возможности внутри. , вы можете повторно создать его просто и даже изменить его функциональность через наследование.

+0

ОК спасибо !!!!!! – java