2015-06-13 3 views
0

Пожалуйста, несите меня, но я очень новичок в Java swing и буквально потратил дни, пытаясь понять это. У меня есть Рамка с двумя панелями. Первая панель имеет две кнопки («Я упрощаю»): «Новый» и «Открыть». Вторая панель отображает пустой JCombobox, когда сначала появляется фрейм, JCombobox - setEnable (false). Цель состоит в том, чтобы пользователь выбирал «Новый» или «Открыть», а компонент на второй панели либо преобразовывал в JTextField, если пользователь нажимает «Создать» или остается как JComboBox, если пользователь нажимает «Открыть». Элементы JComboBox заполняются из базы данных, заполняя Combobox. Моя проблема пытается выяснить, как преобразовать компонент во второй панели как JTextField или JCombobox. Я попытался сделать combobox похожим на JTextField, используя removeallItems и установив setPopupVisible в false, но это, похоже, не работает. Я продолжаю получать компонент с раскрывающимся стрелкой, который при нажатии на него отображает одну пустую строку, которая выглядит странно. Я хочу запретить раскрывающееся меню отображать пустую строку или преобразовать компонент в простой JTextField. Любая помощь действительно будет применена.Java Swing - как сделать компонент Combobox или JtextField

public class newButtonlistener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    clearFields(); 
    newButton.setEnabled(false); 
    openButton.setEnabled(false); 
    calcButton.setEnabled(false); 
    tableButton.setEnabled(false); 
    saveButton.setEnabled(false); 
    textField1.setBackground(Color.WHITE); 
    textField2.setBackground(Color.WHITE); 
    textField3.setBackground(Color.WHITE); 
    setDisable(textField2); 
    textField3.setEnabled(false); 
    table.setEnabled(false); 
    textField1.setEnabled(true); 
    textField1.removeAllItems(); 
    textField1.setPopupVisible(false); 
    BasicComboPopup popup = new BasicComboPopup(textField1); 
    popup.setPopupSize(0, 0); 

    textField1.setEditable(true); 
    textField1.requestFocus(); 
    } 

     } 

ответ

2

Использовать композицию. Имейте JTextField и JComboBox в JPanel, который использует CardLayout (и, таким образом, показывает только по одному). Когда пришло время переключиться, скажите макет панели, чтобы переключить отображаемый компонент.

+0

Благодарим за отзыв. Чтобы уточнить это предложение, создайте новый JPanel, который использует CardLayout. Кроме того, сделайте еще два JPanels: card1 и card2. Скажем, card1 содержит JCombobox и card2 в поле JTextfield. Компоненты будут иметь одну и ту же метку, которую я буду добавлять отдельно к каждой панели. Единственное, о чем я не сомневаюсь, - это убедиться, что card1 и card2 выстраиваются в линию и накладываются друг на друга, поэтому визуально это выглядит просто как поле/компонент, просто изменяющий тип, т. Е. Раскрывающееся окно просто появляется и исчезает. Общая рамка изменчива. – AndyB

+0

Нет необходимости в двух других JPanels - вы можете добавлять компоненты к панели, которая содержит компоненты напрямую. Чтобы добавить ярлык, вы можете использовать BorderLayout и поместить «изменяющийся» компонент в CENTER. И наложение будет выполнено с помощью CardLayout. Пример здесь должен объяснить все, включая фрагменты: http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html –

0

Используйте secondPanel

// first proposition 
    // I suppose the secondPanel contains the combobox 
    secondPanel.removeAll(); 
    secondPanel.add(new JTextField()); 
    // and vice-versa 

    //second proposition 
    // they are both in secondPanel: toogle 
    combobox.setVisible(true); 
    textfield.setVisible(false); 
    //and vice-versa 
0

Я думаю, что это достаточно близко. Я использовал GroupLayout для отдельных карт JPanel. Единственное, что я не могу понять, это то, как остановить изменение размеров компонентов при изменении размера рамки. Любые предложения, которые я бы оценил.

import java.awt.BorderLayout; 
    import java.awt.CardLayout; 
    import java.awt.Container; 
    import java.awt.event.ItemEvent; 
    import java.awt.event.ItemListener; 
    import javax.swing.JButton; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JTextField; 
    import javax.swing.UIManager; 
    import javax.swing.UnsupportedLookAndFeelException; 
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import static javax.swing.GroupLayout.Alignment.BASELINE; 
    import static javax.swing.GroupLayout.Alignment.LEADING; 
    import java.awt.Dimension; 

    public class dataTableSummaryCards implements ItemListener { 
    JPanel cards; //a panel that uses CardLayout 
    final static String OPENPANEL = "Open"; 
    final static String NEWPANEL = "New"; 

    public void addComponentToPane(Container pane) { 
    //Put the JComboBox in a JPanel to get a nicer look. 


    JPanel comboBoxPane = new JPanel(); //use FlowLayout 
    String comboBoxItems[] = { OPENPANEL, NEWPANEL }; 
    JComboBox cb = new JComboBox(comboBoxItems); 
    cb.setEditable(false); 
    cb.addItemListener(this); 
    comboBoxPane.add(cb); 

    //Create the "cards" 



    JComboBox openDataSummary = new JComboBox(); 
    Dimension dim=openDataSummary.getSize(); 
    //  openDataSummary.setMaximumSize(dim); 
    openDataSummary.setPreferredSize(dim); 
    openDataSummary.setMinimumSize(dim); 


    JLabel label1 = new JLabel("Data Summary Name:"); 
    JLabel label2 = new JLabel("Data Summary Name:"); 
    JPanel openCard = new JPanel(); 
    GroupLayout layout = new GroupLayout(openCard); 
    openCard.setLayout(layout); 

    layout.setAutoCreateGaps(true); 
    layout.setAutoCreateContainerGaps(true); 
    layout.setHorizontalGroup(layout.createSequentialGroup() 
     .addGroup(layout.createParallelGroup(LEADING) 
      .addComponent(label1,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE      ,GroupLayout.DEFAULT_SIZE)) 
     .addGroup(layout.createParallelGroup(LEADING) 
      .addComponent(openDataSummary,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE)) 
    ); 

    layout.setVerticalGroup(layout.createSequentialGroup() 
     .addGroup(layout.createParallelGroup()  
      .addComponent(label1,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE) 
      .addComponent(openDataSummary,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAU LT_SIZE,GroupLayout.DEFAULT_SIZE))) 
     ; 


    JTextField newDataSummary = new JTextField(); 
    newDataSummary.setSize(dim); 
    newDataSummary.setPreferredSize(dim); 
    //  newDataSummary.setMaximumSize(dim); 
    newDataSummary.setMinimumSize(dim); 
    JPanel newCard = new JPanel(); 
    GroupLayout layout2 = new GroupLayout(newCard); 
    newCard.setLayout(layout2); 

    layout2.setAutoCreateGaps(true); 
    layout2.setAutoCreateContainerGaps(true); 
    layout2.setHorizontalGroup(layout2.createSequentialGroup() 
     .addGroup(layout2.createParallelGroup(LEADING) 
      .addComponent(label2,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE)) 
     .addGroup(layout2.createParallelGroup(LEADING) 
      .addComponent(newDataSummary,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE)) 
    ); 

    layout2.setVerticalGroup(layout2.createSequentialGroup() 
     .addGroup(layout2.createParallelGroup()  
      .addComponent(label2,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE) 
      .addComponent(newDataSummary,GroupLayout.PREFERRED_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE))) 
     ; 


    //Create the panel that contains the "cards". 
    cards = new JPanel(new CardLayout()); 
    cards.add(openCard, OPENPANEL); 
    cards.add(newCard, NEWPANEL); 

    pane.add(comboBoxPane, BorderLayout.PAGE_START); 
    pane.add(cards, BorderLayout.CENTER); 

    } 

    public void itemStateChanged(ItemEvent evt) { 
    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.show(cards, (String)evt.getItem()); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event dispatch thread. 
    */ 
    private static void createAndShowGUI() { 
    //Create and set up the window. 
    JFrame frame = new JFrame("Data Summary Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 





    //Create and set up the content pane. 
    dataTableSummaryCards demo = new dataTableSummaryCards(); 
    demo.addComponentToPane(frame.getContentPane()); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
    /* Use an appropriate Look and Feel */ 
    try { 
     //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    /* Turn off metal's use of bold fonts */ 
    UIManager.put("swing.boldMetal", Boolean.FALSE); 

    //Schedule a job for the event dispatch thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
    } 
+0

Это помогает сначала установить размер JComboBox. Теперь все работает. – AndyB

Смежные вопросы