JPanel添加JScrollPane无效

本文介绍了在Java Swing中如何调整窗口和面板的尺寸。针对不同情况提供了具体的方法,包括设置首选尺寸、重新验证布局以及打包组件等步骤,确保用户界面能够适应内容变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗体设置大小的时候要用:
this.setPreferredSize(new Dimension(800,550));
this.pack();


JPanel里面的内容发生变化后,要设置JPanel的大小:
zPanel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
zPanel.revalidate();
this.pack();

这几步是必须的
 
import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileNotFoundException; import java.util.Arrays; public class PhotoGallery extends JPanel implements PropertyChangeListener { private final int THUMBNAIL_SIZE = 150; // 缩略图固定宽高 public PhotoGallery(TreeSelectionModel model){ model.addPropertyChangeListener(this); // 注册监听 } @Override public void propertyChange(PropertyChangeEvent evt) { if ("selectedPath".equals(evt.getPropertyName())) { String newPath = (String) evt.getNewValue(); updatePreview(newPath); // 根据新路径更新预览 } } private void updatePreview(String path) { System.out.println("路径已更新: " + path); // 实际业务逻辑(如加载文件内容、显示缩略图等) init(path); } public void init(String filepath) { File folder = new File(filepath); if (!folder.exists() || !folder.isDirectory()) { System.out.println("指定的文件夹路径不正确或无法识别!"); return; } File[] images = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".png") || name.toLowerCase().endsWith(".jpeg") || name.toLowerCase().endsWith(".gif") || name.toLowerCase().endsWith("bmp")); if (images == null) { System.out.println("无法列出文件夹内的项目."); return; } JPanel imageContainer = new JPanel(); imageContainer.setLayout(new GridLayout(0, 4,5,5)); // 设定网格布局,一行四列 for (File file : Arrays.asList(images)) { BufferedImage img = ImageUtils.resizeImage(file.getAbsolutePath(), THUMBNAIL_SIZE, THUMBNAIL_SIZE); JLabel label = new JLabel(new ImageIcon(img)); label.setText(file.getName()); label.setFont(new Font("微软雅黑", Font.PLAIN, 16)); // 设置字体 label.setForeground(Color.BLACK); // 设置字体颜色 label.setHorizontalTextPosition(JLabel.CENTER); // 设置文字水平对齐方式为居中 label.setVerticalTextPosition(JLabel.BOTTOM); // 设置文字垂直对齐方式为底部 JPanel panel = new JPanel(); panel.add(label); Border border = BorderFactory.createEmptyBorder(2, 2, 2, 2); panel.setBorder(border); addMouseClickListener(panel, file.getAbsolutePath()); imageContainer.add(panel); } JScrollPane scrollPane = new JScrollPane(imageContainer, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); this.add(scrollPane); } private void addMouseClickListener(final JComponent component, String imagePath) { MouseAdapter mouseListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { JOptionPane.showMessageDialog(component.getParent(), "你选择了:" + new File(imagePath).getName(), "图片详情", JOptionPane.PLAIN_MESSAGE); // 如果需要弹出大图预览窗体或者其他操作可以在下方补充相应逻辑 } @Override public void mouseEntered(MouseEvent evt) { Border highlightedBorder = BorderFactory.createLineBorder(Color.GRAY, 2, true); ((JPanel) evt.getSource()).setBorder(highlightedBorder); } @Override public void mouseExited(MouseEvent evt) { Border defaultBorder = BorderFactory.createEmptyBorder(2, 2, 2, 2); ((JPanel) evt.getSource()).setBorder(defaultBorder); } }; component.addMouseListener(mouseListener); } }按照上述想法修改这段代码
03-09
package com.student.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.student.entity.Student; import com.student.util.DBUtil; public class StudentDAO { // 插入学生 public void insertStudent(Student student) { String sql = "INSERT INTO students (sid, name, age, score) VALUES (?, ?, ?, ?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, student.getSid()); pstmt.setString(2, student.getName()); pstmt.setInt(3, student.getAge()); pstmt.setDouble(4, student.getScore()); pstmt.executeUpdate(); } catch (SQLException e) { System.err.println("插入学生信息时出现错误: " + e.getMessage()); } } // 获取所有学生 public List<Student> getAllStudents() { List<Student> students = new ArrayList<>(); String sql = "SELECT * FROM students"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { students.add(extractStudentFromResultSet(rs)); } } catch (SQLException e) { e.printStackTrace(); } return students; } // 删除学生(修改方法名) public void deleteStudent(String sid) { // 这修改了方法名 String sql = "DELETE FROM students WHERE sid = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, sid); int rowsAffected = pstmt.executeUpdate(); if (rowsAffected == 0) { System.err.println("未找到学号为 " + sid + " 的学生"); } } catch (SQLException e) { e.printStackTrace(); } } // 更新学生信息 public void updateStudent(Student student) { String sql = "UPDATE students SET name = ?, age = ?, score = ? WHERE sid = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, student.getName()); pstmt.setInt(2, student.getAge()); pstmt.setDouble(3, student.getScore()); pstmt.setString(4, student.getSid()); int rowsAffected = pstmt.executeUpdate(); if (rowsAffected == 0) { System.err.println("未找到学号为 " + student.getSid() + " 的学生"); } } catch (SQLException e) { e.printStackTrace(); } } // 搜索学生 public List<Student> searchStudents(String keyword) { List<Student> students = new ArrayList<>(); String sql = "SELECT * FROM students WHERE sid LIKE ? OR name LIKE ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { String searchPattern = "%" + keyword + "%"; pstmt.setString(1, searchPattern); pstmt.setString(2, searchPattern); try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { students.add(extractStudentFromResultSet(rs)); } } } catch (SQLException e) { e.printStackTrace(); } return students; } // 排序学生 public List<Student> getStudentsOrderBy(String field) { List<Student> students = new ArrayList<>(); String validField = validateSortField(field); String sql = "SELECT * FROM students ORDER BY " + validField; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { students.add(extractStudentFromResultSet(rs)); } } catch (SQLException e) { e.printStackTrace(); } return students; } // 根据ID获取学生 public Student getStudentById(String sid) { String sql = "SELECT * FROM students WHERE sid = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, sid); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { return extractStudentFromResultSet(rs); } } } catch (SQLException e) { e.printStackTrace(); } return null; } // 验证排序字段(防止SQL注入) private String validateSortField(String field) { String[] validFields = {"sid", "name", "age", "score"}; for (String valid : validFields) { if (valid.equalsIgnoreCase(field)) { return valid; } } return "sid"; // 默认值 } // 从ResultSet提取学生对象(复用代码) private Student extractStudentFromResultSet(ResultSet rs) throws SQLException { String sid = rs.getString("sid"); String name = rs.getString("name"); int age = rs.getInt("age"); double score = rs.getDouble("score"); return new Student(sid, name, age, score); } } package com.student.ui; import com.student.dao.StudentDAO; import com.student.entity.Student; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.util.List; public class StudentGUI extends JFrame { private JTable studentTable; private DefaultTableModel tableModel; private StudentDAO studentDAO = new StudentDAO(); private JTextField searchField; private JComboBox<String> sortComboBox; public StudentGUI() { setTitle("学生信息管理系统"); setSize(900, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置淡蓝色背景 getContentPane().setBackground(new Color(230, 240, 255)); // 创建表格 String[] columns = {"学号", "姓名", "年龄", "成绩"}; tableModel = new DefaultTableModel(columns, 0) { @Override public boolean isCellEditable(int row, int column) { return false; // 禁止表格直接编辑 } }; studentTable = new JTable(tableModel); studentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 创建功能面板 JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); controlPanel.setBackground(new Color(230, 240, 255)); // 搜索组件 searchField = new JTextField(15); JButton searchBtn = new JButton("查找"); searchBtn.addActionListener(e -> searchStudents()); controlPanel.add(new JLabel("搜索:")); controlPanel.add(searchField); controlPanel.add(searchBtn); // 排序组件 sortComboBox = new JComboBox<>(new String[]{"学号", "姓名", "年龄", "成绩"}); JButton sortBtn = new JButton("排序"); sortBtn.addActionListener(e -> sortStudents()); controlPanel.add(new JLabel("排序:")); controlPanel.add(sortComboBox); controlPanel.add(sortBtn); // 操作按钮 JButton addBtn = new JButton("添加学生"); addBtn.addActionListener(e -> showAddDialog()); JButton editBtn = new JButton("修改"); editBtn.addActionListener(e -> showEditDialog()); JButton deleteBtn = new JButton("删除"); deleteBtn.addActionListener(e -> deleteStudent()); // 添加按钮到面板 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); buttonPanel.setBackground(new Color(230, 240, 255)); buttonPanel.add(addBtn); buttonPanel.add(editBtn); buttonPanel.add(deleteBtn); // 主布局 JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); mainPanel.setBackground(new Color(230, 240, 255)); mainPanel.add(controlPanel, BorderLayout.NORTH); mainPanel.add(new JScrollPane(studentTable), BorderLayout.CENTER); mainPanel.add(buttonPanel, BorderLayout.SOUTH); setContentPane(mainPanel); refreshTable(); } // 添加学生对话框 private void showAddDialog() { JDialog dialog = new JDialog(this, "添加学生", true); dialog.setSize(300, 250); dialog.setLayout(new BorderLayout()); dialog.getContentPane().setBackground(new Color(230, 240, 255)); JPanel formPanel = createFormPanel(); JButton saveBtn = new JButton("保存"); // 获取表单字段 JTextField sidField = (JTextField) formPanel.getComponent(1); JTextField nameField = (JTextField) formPanel.getComponent(3); JTextField ageField = (JTextField) formPanel.getComponent(5); JTextField scoreField = (JTextField) formPanel.getComponent(7); saveBtn.addActionListener(e -> { try { Student student = new Student( sidField.getText(), nameField.getText(), Integer.parseInt(ageField.getText()), Double.parseDouble(scoreField.getText()) ); studentDAO.insertStudent(student); refreshTable(); dialog.dispose(); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE); } }); dialog.add(formPanel, BorderLayout.CENTER); dialog.add(saveBtn, BorderLayout.SOUTH); dialog.setVisible(true); } // 修改学生对话框 private void showEditDialog() { int selectedRow = studentTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, "请先选择要修改的学生", "提示", JOptionPane.WARNING_MESSAGE); return; } String sid = (String) tableModel.getValueAt(selectedRow, 0); Student student = studentDAO.getStudentById(sid); JDialog dialog = new JDialog(this, "修改学生信息", true); dialog.setSize(300, 250); dialog.setLayout(new BorderLayout()); dialog.getContentPane().setBackground(new Color(230, 240, 255)); JPanel formPanel = createFormPanel(); // 填充当前数据 ((JTextField) formPanel.getComponent(1)).setText(student.getSid()); ((JTextField) formPanel.getComponent(3)).setText(student.getName()); ((JTextField) formPanel.getComponent(5)).setText(String.valueOf(student.getAge())); ((JTextField) formPanel.getComponent(7)).setText(String.valueOf(student.getScore())); // 学号不可编辑 ((JTextField) formPanel.getComponent(1)).setEditable(false); JButton saveBtn = new JButton("保存"); saveBtn.addActionListener(e -> { try { student.setName(((JTextField) formPanel.getComponent(3)).getText()); student.setAge(Integer.parseInt(((JTextField) formPanel.getComponent(5)).getText())); student.setScore(Double.parseDouble(((JTextField) formPanel.getComponent(7)).getText())); studentDAO.updateStudent(student); refreshTable(); dialog.dispose(); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE); } }); dialog.add(formPanel, BorderLayout.CENTER); dialog.add(saveBtn, BorderLayout.SOUTH); dialog.setVisible(true); } // 创建表单面板(复用) private JPanel createFormPanel() { JPanel formPanel = new JPanel(new GridLayout(4, 2, 5, 10)); formPanel.setBackground(new Color(230, 240, 255)); formPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); formPanel.add(new JLabel("学号:")); formPanel.add(new JTextField()); formPanel.add(new JLabel("姓名:")); formPanel.add(new JTextField()); formPanel.add(new JLabel("年龄:")); formPanel.add(new JTextField()); formPanel.add(new JLabel("成绩:")); formPanel.add(new JTextField()); return formPanel; } // 删除学生 private void deleteStudent() { int selectedRow = studentTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, "请先选择要删除的学生", "提示", JOptionPane.WARNING_MESSAGE); return; } int confirm = JOptionPane.showConfirmDialog( this, "确定要删除该学生吗?", "确认删除", JOptionPane.YES_NO_OPTION ); if (confirm == JOptionPane.YES_OPTION) { String sid = (String) tableModel.getValueAt(selectedRow, 0); studentDAO.deleteStudent(sid); refreshTable(); } } // 搜索学生 private void searchStudents() { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { refreshTable(); return; } List<Student> students = studentDAO.searchStudents(keyword); updateTable(students); } // 排序学生 private void sortStudents() { String sortBy = (String) sortComboBox.getSelectedItem(); String sortField = ""; switch (sortBy) { case "学号": sortField = "sid"; break; case "姓名": sortField = "name"; break; case "年龄": sortField = "age"; break; case "成绩": sortField = "score"; break; } List<Student> students = studentDAO.getStudentsOrderBy(sortField); updateTable(students); } // 刷新表格 private void refreshTable() { List<Student> students = studentDAO.getAllStudents(); updateTable(students); } // 更新表格数据 private void updateTable(List<Student> students) { tableModel.setRowCount(0); for (Student s : students) { tableModel.addRow(new Object[]{s.getSid(), s.getName(), s.getAge(), s.getScore()}); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { StudentGUI gui = new StudentGUI(); gui.setVisible(true); }); } } 请根据这两个代码修改
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值