У меня было желание создать что-то подобное.
Сначала я попытался реализовать что-то по линиям, предложенным Варуном, но это оказалось немного беспорядочным, и я немного нервничаю, когда начинаю играть с объектами ComponentUI (я бы предпочел оставить этот вид вещи к L & F). Если у кого-то есть хороший пример этого, мне было бы интересно его увидеть.
Затем я попробовал кнопку подход ... и думал, что я хотел бы поделиться код с сообществом SO:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.plaf.basic.BasicInternalFrameUI;
import javax.swing.plaf.metal.MetalComboBoxIcon;
public class MockJComboBox extends JPanel {
private boolean _isPoppedUp = false;
public MockJComboBox(String label, final JComponent toShow) {
setLayout(new BorderLayout());
JLabel jLabel = new JLabel(label);
jLabel.setBackground(Color.WHITE);
add(jLabel, BorderLayout.CENTER);
Icon icon = new MetalComboBoxIcon();
final JInternalFrame popup = new JInternalFrame(null, false, false, false, false);
final JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(toShow), BorderLayout.CENTER);
if(!(System.getProperty("os.name").startsWith("Mac OS"))){
BasicInternalFrameUI ui = (BasicInternalFrameUI) popup.getUI();
ui.getNorthPane().setPreferredSize(new Dimension(0,0));
}
popup.setBorder(null);
popup.setContentPane(panel);
popup.pack();
popup.setVisible(true);
final JButton dropDownButton = new JButton(icon);
dropDownButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_isPoppedUp = !_isPoppedUp;
Container parent = getParent();
if (_isPoppedUp) {
popup.setLocation(panel.getX(), panel.getY() + panel.getHeight());
popup.setSize(panel.getWidth(), toShow.getHeight());
parent.add(popup);
} else {
parent.remove(popup);
parent.repaint();
}
}
});
add(dropDownButton, BorderLayout.EAST);
}
public boolean isPoppedUp() {
return _isPoppedUp;
}
}
Если вы заметили какие-либо ошибки или есть предложения о том, как улучшить этот код, I» буду благодарен за ваши комментарии!
Я не уверен, что понимаю концепцию. Когда дерево всплывает, вы сможете выбрать узел из дерева и отобразить это значение в поле со списком? Когда дерево всплывает, это узел в дереве, уже выбранном/расширенном, на основе значения в поле со списком? Или это просто способ отображения дерева щелчком мыши? – camickr
Первый случай: дерево всплывает, узел уже выбран (если есть), щелкните узел, JComboBox запускает ActionEvent, чтобы сигнализировать о том, что выбор изменился, и дерево исчезло. На самом деле у меня есть способ отображения дерева щелчком мыши (с помощью JCommandButton в пакете компонентов фламинго). – Carcassi