2013-12-16 6 views
-1

Существует JPanel с кнопками и textField. TextField фильтрует ненужные кнопки по имени. Но после удаления размер кнопок отдыха меняется. Высота кнопок не должна изменяться после фильтрации в текстовом поле. Как достичь этого?Фиксированный размер кнопок

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


public void run() { 

JDialog dialog = new TestDialog(); 
dialog.setLocationRelativeTo(null); 
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
dialog.setTitle("Type text and press Enter"); 
dialog.setSize(300, 700); 
dialog.setVisible(true); 
dialog.setLocationRelativeTo(null); 
dialog.setModal(true); 
} 
}); 
} 
} 

class TestDialog extends JDialog { 

public TestDialog() { 
    getContentPane().add(new JPan 

el(), BorderLayout.CENTER); 
    getContentPane().add(createBtnPanel(), BorderLayout.CENTER); 
} 



private JPanel createBtnPanel() { 
     int n = 100; 
    Final String ArrButtonNames[] = new String[n]; 
for (int h = 0; h < ArrButtonNames.length; h++) { 
    if ((h%2)==0){ 
     ArrButtonNames[h]="Filter"+h; 
    } 
    else{ 
     ArrButtonNames[h]="Button"+h; 
    } 
} 

final JButton ArrButton[] = new JButton[n]; 
final JPanel btnPanel = new JPanel(new GridLayout(0, ArrButtonNames.length, 1,1)); 
btnPanel.setLayout(new GridLayout(0, 1)); 
final JTextField textField = new JTextField(); 
textField.setColumns(23); 
btnPanel.add(textField); 
for (int i = 0; i < ArrButtonNames.length; i++) { 
    String btnString = ArrButtonNames[i]; 
    JButton button = new JButton(btnString); 

    Dimension d = button.getPreferredSize(); 
    d.setSize(d.getWidth(), d.getHeight()*1); 
    button.setPreferredSize(d); 
    button.setSize(d); 
    button.setMinimumSize(d); 
    button.setMaximumSize(d); 

    btnPanel.add(button); 
    ArrButton[i] = button; 
} 
textField.addActionListener(new ActionListener() { 
public void actionPerformed(ActionEvent e) { 
    for(int k = 0; k < ArrButtonNames.length; k++) { 
     if(ArrButtonNames[k].indexOf(textField.getText())==-1) { 
      btnPanel.remove(ArrButton[k]); 
      btnPanel.revalidate(); 
      btnPanel.repaint(); 
     } 
    } 
} 
}); 

JPanel MainPanel = new JPanel(); 
MainPanel.setLayout(new BorderLayout()); 
MainPanel.add(btnPanel, BorderLayout.NORTH); 
final JScrollPane scrollPane = new JScrollPane(btnPanel); 
MainPanel.add(scrollPane, BorderLayout.CENTER); 
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    return MainPanel; 
} 
} 

ответ

1

Вы этот эффект, потому что вы используете GridLayout, что изменение размера компонентов заполнить всю ячейку.

Для ваших целей я рекомендую вам использовать GridBagLayout, который может делать то, что вы хотите.

Попробуйте использовать следующий код для наполнения вашего btnPanel вместо твоего:

final JButton ArrButton[] = new JButton[n]; 
    final JPanel btnPanel = new JPanel(); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.WEST; 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.weightx = 1; 
    c.gridx=0; 
    c.gridy=0; 
    btnPanel.setLayout(new GridBagLayout()); 
    final JTextField textField = new JTextField(); 
    btnPanel.add(textField,c); 
    for (int i = 0; i < ArrButtonNames.length; i++) { 
     String btnString = ArrButtonNames[i]; 
     JButton button = new JButton(btnString); 
     c.gridy ++; 
     btnPanel.add(button,c); 
     ArrButton[i] = button; 
    } 
    c.fill = GridBagConstraints.BOTH; 
    c.weighty = 1; 
    c.gridy ++; 
    btnPanel.add(new JLabel(""),c); 

И это выглядит следующим образом:

enter image description here

также использовать метод pack() вместо setSize(...), и не используйте setPreferedSize(...) и другие методы измерения, прочитанные об этом here.

+0

Спасибо за советы, это работает! А как сделать панель уменьшить ее размер соответственно количеством кнопок? – user3106328

+0

Вы можете использовать 'TestDialog.this.pack();' внутри вашего 'ActionListener' для' JTextField' – alex2410

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