📄 jtextlist.java
字号:
package app.pane;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.text.Position;
/**
* JTextList是一个另一种风格的列表框, 上面是文本,下面是列表, 当单击列表选择项目是,会在上面文本框中 显示出来,如果在上面文本框中输入数据,
* 会在下面列表中自动滚动。
* <p>
* 注:功能最简化
*
* @author 黄兴海
*
*/
public class JTextList extends JComponent {
private JTextField textField;
private JList list;
private JScrollPane scrollPane;
final private Rectangle TEXTFIELD_DEFAULT_RECT = new Rectangle(0, 0, 100,
23);
final private Rectangle SCROLLPANE_DEFAULT_RECT = new Rectangle(0, 22, 100,
110);
JTextList() {
textField = new JTextField();
textField.setBounds(TEXTFIELD_DEFAULT_RECT);
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(final KeyEvent e) {
int size = list.getModel().getSize();
if (size == 0)
return;// 列表中没有任何元素
String str = textField.getText();
int index = list.getNextMatch(str, 0, Position.Bias.Forward);
if (index >= 0) {
// 将所选的项目显示出来
list.ensureIndexIsVisible(size - 1);
list.ensureIndexIsVisible(index);
// 当完全匹配时,修正textField的值
if (str.equalsIgnoreCase((String) (list.getModel()
.getElementAt(index)))) {
textField.setText((String) (list.getModel()
.getElementAt(index)));
list.setSelectedIndex(index);
} else {
list.clearSelection();
}
} else {
list.ensureIndexIsVisible(0);
list.clearSelection();
}
}
});
textField.setAutoscrolls(false);
list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (list.getSelectedValues().length > 0)
textField.setText(list.getSelectedValue().toString());
}
});
JViewport jv = new JViewport();
jv.add(list);
scrollPane = new JScrollPane();
scrollPane
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SCROLLPANE_DEFAULT_RECT);
scrollPane.setViewportView(list);
add(textField);
add(scrollPane);
}
public JTextField getTextField() {
return textField;
}
public JList getList() {
return list;
}
public JScrollPane getScrollPane() {
return scrollPane;
}
@Override
public void setBounds(int x, int y, int width, int height) {
textField.setBounds(0, 0, width, 23);
scrollPane.setBounds(0, 22, width, height - 22);
super.setBounds(x, y, width, height);
}
@Override
public void setBounds(Rectangle rect) {
setBounds(rect.x, rect.y, rect.width, rect.height);
}
public void disableText() {
textField.setFocusable(false);
}
public void setListData(Object[] obj) {
list.setListData(obj);
}
public void selectText(String str) {
int size = list.getModel().getSize();
if (size == 0)
return;// 列表中没有任何元素
int index = list.getNextMatch(str, 0, Position.Bias.Forward);
if (index >= 0) {
// 将所选的项目显示出来
list.ensureIndexIsVisible(index);
// 当完全匹配时,修正textField的值
if (str.equalsIgnoreCase((String) (list.getModel()
.getElementAt(index)))) {
textField
.setText((String) (list.getModel().getElementAt(index)));
list.setSelectedIndex(index);
} else {
list.clearSelection();
}
} else {
list.ensureIndexIsVisible(0);
list.clearSelection();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -