如何使用 java swing 在 jlist 中的现有元素下添加新元素?
How to add new element under existing element in jlist using java swing?
我正在使用 jlist 显示我的数据库数据。该过程可以很好地从数据库中获取数据并显示在 jlist 元素中。我需要通过单击事件在 jlist 元素下显示我的数据。示例:包含用户名的 Jlist,单击特定用户后,它应在 jlist 元素下方显示用户的属性。
建议我,如果有办法执行此过程或无法显示在特定的 jlist 元素下。
谢谢。
您首先要做的事情之一永远是 JavaDocs and tutorials,因为他们通常不会这样做,请举例说明如何完成。
因此,您现在需要根据MouseEvent
(或Point
)元素的索引。有趣的是,在浏览 JList
JavaDocs 时,我偶然发现了这个例子...
MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int index = list.locationToIndex(e.getPoint());
System.out.println("Double clicked on Item " + index);
}
}
};
list.addMouseListener(mouseListener);
好的,好的,我们知道JList
中元素的索引,我们可以用ListModel#elementAt
得到物理元素,可以用来查询数据库,查查属性,或者,如果您已正确完成并将实际对象嵌入到模型中,则获取属性。
将元素动态添加到 JList
/ListModel
的唯一方法是通过可变 ListModel
,例如 DefaultListModel
.
综上所述,JTable
和 JTree
都是显示复合信息的更好组件。
这是动态树的工作示例,它将数据库作为节点加载,并将它们的表作为子节点加载 node.First 您必须创建一个包含所有数据库节点的 root
节点,然后隐藏根节点这给你 databases.After 列表的感觉,当我们单击任何数据库节点时,它会在树中动态加载其表(注意:它仅在单击数据库节点时加载表)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class DatabaseTree implements TreeSelectionListener {
JFrame frame;
DefaultTreeModel treeModel;
DefaultTreeCellRenderer cellRenderer;
JScrollPane pane;
JTree tree;
Connection connection;
PreparedStatement pst;
ResultSet rs;
List<String> databaseNode = new ArrayList<String>();
public DatabaseTree() {
// JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
root.setUserObject("Database");
treeModel = new DefaultTreeModel(root);
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ganesh", "root",
"admina");
pst = connection.prepareStatement("show databases");
rs = pst.executeQuery();
while (rs.next()) {
String text = rs.getString(1);
databaseNode.add(text);
root.add(new DefaultMutableTreeNode(text));
}
} catch (Exception e) {
e.printStackTrace();
}
tree = new JTree(treeModel);
tree.addTreeSelectionListener(this);
tree.setRootVisible(false);
tree.expandRow(0);
pane = new JScrollPane(tree);
frame.getContentPane().add(pane);
frame.setVisible(true);
frame.pack();
}
public static void main(String args[]) {
new DatabaseTree();
}
@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
String text = (String) node.getUserObject();
if (databaseNode.contains(text)) {
if (node.getChildCount() == 0) {
try {
pst = connection.prepareStatement("show tables in " + text);
rs = pst.executeQuery();
while (rs.next()) {
String data = rs.getString(1);
node.add(new DefaultMutableTreeNode(data));
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
}
}
已更新
对于树节点上的单击事件,您必须在其上添加 mouseListener
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
TreePath treePath = tree.getPathForLocation(e.getX(), e.getY());
if (treePath != null)
String text = ((DefaultMutableTreeNode)treePath.getLastPathComponent()).getUserObject();
txtField.setText(text);
else
txtField.setText("");
}
});
}
@Arunachalam 这是使用 DefaultTreeCellRenderer
.
包含图像的树节点示例
import java.awt.Component;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
public class DatabaseTree implements TreeSelectionListener {
JFrame frame;
DefaultTreeModel treeModel;
DefaultTreeCellRenderer cellRenderer;
JScrollPane pane;
JTree tree;
Connection connection;
PreparedStatement pst;
ResultSet rs;
List<String> databaseNode = new ArrayList<String>();
public DatabaseTree() {
// JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
root.setUserObject(new JLabel("Databases", new ImageIcon("/images/g.jpg"), JLabel.CENTER));
treeModel = new DefaultTreeModel(root);
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ganesh", "root",
"admina");
pst = connection.prepareStatement("show databases");
rs = pst.executeQuery();
while (rs.next()) {
String text = rs.getString(1);
databaseNode.add(text);
root.add(new DefaultMutableTreeNode(new JLabel(text, new ImageIcon("/images/g.jpg"),
JLabel.CENTER)));
}
} catch (Exception e) {
e.printStackTrace();
}
tree = new JTree(treeModel);
tree.setCellRenderer(new MyTreeCellRenderer());
tree.addTreeSelectionListener(this);
tree.setRootVisible(true);
tree.expandRow(0);
pane = new JScrollPane(tree);
frame.setContentPane(pane);
frame.setVisible(true);
}
public static void main(String args[]) {
new DatabaseTree();
}
@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
String text = ((JLabel) node.getUserObject()).getText();
JLabel label = null;
if (databaseNode.contains(text)) {
if (node.getChildCount() == 0) {
try {
pst = connection.prepareStatement("show tables in " + text);
rs = pst.executeQuery();
while (rs.next()) {
String data = rs.getString(1);
label = new JLabel(data);
node.add(new DefaultMutableTreeNode(label));
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
}
class MyTreeCellRenderer extends DefaultTreeCellRenderer {
JLabel label;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
label = (JLabel) node.getUserObject();
if (selected) {
label.setBackground(backgroundSelectionColor);
label.setForeground(textSelectionColor);
} else {
label.setBackground(backgroundNonSelectionColor);
label.setForeground(textNonSelectionColor);
}
return label;
}
}
}
我正在使用 jlist 显示我的数据库数据。该过程可以很好地从数据库中获取数据并显示在 jlist 元素中。我需要通过单击事件在 jlist 元素下显示我的数据。示例:包含用户名的 Jlist,单击特定用户后,它应在 jlist 元素下方显示用户的属性。
建议我,如果有办法执行此过程或无法显示在特定的 jlist 元素下。
谢谢。
您首先要做的事情之一永远是 JavaDocs and tutorials,因为他们通常不会这样做,请举例说明如何完成。
因此,您现在需要根据MouseEvent
(或Point
)元素的索引。有趣的是,在浏览 JList
JavaDocs 时,我偶然发现了这个例子...
MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int index = list.locationToIndex(e.getPoint());
System.out.println("Double clicked on Item " + index);
}
}
};
list.addMouseListener(mouseListener);
好的,好的,我们知道JList
中元素的索引,我们可以用ListModel#elementAt
得到物理元素,可以用来查询数据库,查查属性,或者,如果您已正确完成并将实际对象嵌入到模型中,则获取属性。
将元素动态添加到 JList
/ListModel
的唯一方法是通过可变 ListModel
,例如 DefaultListModel
.
综上所述,JTable
和 JTree
都是显示复合信息的更好组件。
这是动态树的工作示例,它将数据库作为节点加载,并将它们的表作为子节点加载 node.First 您必须创建一个包含所有数据库节点的 root
节点,然后隐藏根节点这给你 databases.After 列表的感觉,当我们单击任何数据库节点时,它会在树中动态加载其表(注意:它仅在单击数据库节点时加载表)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class DatabaseTree implements TreeSelectionListener {
JFrame frame;
DefaultTreeModel treeModel;
DefaultTreeCellRenderer cellRenderer;
JScrollPane pane;
JTree tree;
Connection connection;
PreparedStatement pst;
ResultSet rs;
List<String> databaseNode = new ArrayList<String>();
public DatabaseTree() {
// JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
root.setUserObject("Database");
treeModel = new DefaultTreeModel(root);
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ganesh", "root",
"admina");
pst = connection.prepareStatement("show databases");
rs = pst.executeQuery();
while (rs.next()) {
String text = rs.getString(1);
databaseNode.add(text);
root.add(new DefaultMutableTreeNode(text));
}
} catch (Exception e) {
e.printStackTrace();
}
tree = new JTree(treeModel);
tree.addTreeSelectionListener(this);
tree.setRootVisible(false);
tree.expandRow(0);
pane = new JScrollPane(tree);
frame.getContentPane().add(pane);
frame.setVisible(true);
frame.pack();
}
public static void main(String args[]) {
new DatabaseTree();
}
@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
String text = (String) node.getUserObject();
if (databaseNode.contains(text)) {
if (node.getChildCount() == 0) {
try {
pst = connection.prepareStatement("show tables in " + text);
rs = pst.executeQuery();
while (rs.next()) {
String data = rs.getString(1);
node.add(new DefaultMutableTreeNode(data));
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
}
}
已更新 对于树节点上的单击事件,您必须在其上添加 mouseListener
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
TreePath treePath = tree.getPathForLocation(e.getX(), e.getY());
if (treePath != null)
String text = ((DefaultMutableTreeNode)treePath.getLastPathComponent()).getUserObject();
txtField.setText(text);
else
txtField.setText("");
}
});
}
@Arunachalam 这是使用 DefaultTreeCellRenderer
.
import java.awt.Component;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
public class DatabaseTree implements TreeSelectionListener {
JFrame frame;
DefaultTreeModel treeModel;
DefaultTreeCellRenderer cellRenderer;
JScrollPane pane;
JTree tree;
Connection connection;
PreparedStatement pst;
ResultSet rs;
List<String> databaseNode = new ArrayList<String>();
public DatabaseTree() {
// JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
root.setUserObject(new JLabel("Databases", new ImageIcon("/images/g.jpg"), JLabel.CENTER));
treeModel = new DefaultTreeModel(root);
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ganesh", "root",
"admina");
pst = connection.prepareStatement("show databases");
rs = pst.executeQuery();
while (rs.next()) {
String text = rs.getString(1);
databaseNode.add(text);
root.add(new DefaultMutableTreeNode(new JLabel(text, new ImageIcon("/images/g.jpg"),
JLabel.CENTER)));
}
} catch (Exception e) {
e.printStackTrace();
}
tree = new JTree(treeModel);
tree.setCellRenderer(new MyTreeCellRenderer());
tree.addTreeSelectionListener(this);
tree.setRootVisible(true);
tree.expandRow(0);
pane = new JScrollPane(tree);
frame.setContentPane(pane);
frame.setVisible(true);
}
public static void main(String args[]) {
new DatabaseTree();
}
@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
String text = ((JLabel) node.getUserObject()).getText();
JLabel label = null;
if (databaseNode.contains(text)) {
if (node.getChildCount() == 0) {
try {
pst = connection.prepareStatement("show tables in " + text);
rs = pst.executeQuery();
while (rs.next()) {
String data = rs.getString(1);
label = new JLabel(data);
node.add(new DefaultMutableTreeNode(label));
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
}
class MyTreeCellRenderer extends DefaultTreeCellRenderer {
JLabel label;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
label = (JLabel) node.getUserObject();
if (selected) {
label.setBackground(backgroundSelectionColor);
label.setForeground(textSelectionColor);
} else {
label.setBackground(backgroundNonSelectionColor);
label.setForeground(textNonSelectionColor);
}
return label;
}
}
}