Пользовательский JFileChooser. Как добавить JComboBox в JFileChooser
Я хочу добавить JComboBox в JFileChooser.
Я попытался расширить JFileChooser и добавить поле со списком вручную. Мне действительно удалось это сделать, но это убрало панель навигации по файлам из диалога JFileChooser. Код:
public class CustomDefinitionJFileChooser extends JFileChooser{
public CustomDefinitionJFileChooser() {
JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] { "Item 1", "Item 2" }));
super.add(comboBox);
}
}
Ожидаемый результат:
Фактический результат:
2 ответа
Сначала попытайтесь получить Container
места, которое вы хотите добавить combobox
, Затем просто добавьте комбинированный список в этот контейнер.
Например, здесь сначала я нашел Container
панель из Save
а также Cancel
кнопка.
JPanel panel1 = (JPanel)this.getComponent(3);
JPanel panel2 = (JPanel) panel1.getComponent(3);
Затем я добавил комбинированный список в панель 2
panel2.add(comboBox);
Это будет выглядеть так:
Полный код:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
public class TestFilechooser extends JFrame {
private JPanel contentPane;
MyFileChooser jc;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestFilechooser frame = new TestFilechooser();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestFilechooser() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
jc = new MyFileChooser();
JButton btnOpen = new JButton("open");
contentPane.add(btnOpen, BorderLayout.NORTH);
btnOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int returnVal = jc.showOpenDialog(TestFilechooser.this);
}
});
pack();
}
}
class MyFileChooser extends JFileChooser{
public MyFileChooser() {
JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] { "Item 1", "Item 2" }));
JPanel panel1 = (JPanel)this.getComponent(3);
JPanel panel2 = (JPanel) panel1.getComponent(3);
Component c1=panel2.getComponent(0);//optional used to add the buttons after combobox
Component c2=panel2.getComponent(1);//optional used to add the buttons after combobox
panel2.removeAll();
panel2.add(comboBox);
panel2.add(c1);//optional used to add the buttons after combobox
panel2.add(c2);//optional used to add the buttons after combobox
}
}
Легкий процесс:
Это решение не добавит комбобокс внизу, но я думаю, что он может вам помочь.
Измените свой класс следующим образом:
class MyFileChooser extends JFileChooser{
public MyFileChooser() {
JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] { "Item 1", "Item 2" }));
JPanel panel = new JPanel();
panel.add(comboBox);
setAccessory(panel);
//add(comboBox, BorderLayout.SOUTH);
}
}
Результат:
Полный рабочий код для примера:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
public class TestFilechooser extends JFrame {
private JPanel contentPane;
MyFileChooser jc;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestFilechooser frame = new TestFilechooser();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestFilechooser() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
jc = new MyFileChooser();
JButton btnOpen = new JButton("open");
contentPane.add(btnOpen, BorderLayout.NORTH);
btnOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int returnVal = jc.showOpenDialog(TestFilechooser.this);
}
});
pack();
}
}
class MyFileChooser extends JFileChooser{
public MyFileChooser() {
JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] { "Item 1", "Item 2" }));
JPanel panel = new JPanel();
panel.add(comboBox);
setAccessory(panel);
//add(comboBox, BorderLayout.SOUTH);
}
}
private void addEncodingComboBox(JFileChooser f,JComboBox<String> encodingComboBox, JLabel encodingLabel) {
Component comp =f.getComponent(2);
JPanel fPanel=(JPanel) comp;
JPanel na=(JPanel)fPanel.getComponent(2);
JPanel fields=(JPanel)na.getComponent(2);
fields.add(Box.createRigidArea(new Dimension(1,8)));
fields.add(encodingComboBox);
JPanel labels=(JPanel)na.getComponent(0);
labels.add(Box.createRigidArea(new Dimension(1,12)));
labels.add(encodingLabel);
}
fields содержит поле со списком, метки содержат метки для компонентов в полях. Этот код работает, только если UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); Результат называется: http://kepfeltoltes.hu/140810/103167300asd_www.kepfeltoltes.hu_.png