JFrame.setBackground设置无效

本文详细介绍了如何在Java Swing中正确地设置JFrame的背景颜色,并对比了JFrame与Frame在背景设置上的区别。此外,还提供了如何设置JFrame透明度的示例代码。

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

JFrame这样的框架,一旦创建,在其中就已经包含一个内容面板,一般我们在往JFrame中添加组件时,都加在了内容面板中,这个面板可以通过JFrame的成员方法getContentPane()取出来,所以如果设置JFrame的背景颜色,仍然会被内容面板盖住,不如设置内容面板的背景颜色,如果框架中还加有其他面板,内容面板的颜色也会被其他面板盖住,要注意一下面板的布局情况。

在使用JFrame.setBackground(new Color);是发现这个方法调用后并没有改变JFrame窗口的背景颜色,这体现了点JFrame和Frame的区别: JFrame要用: JFrame.getContentPane().setBackground(new Color); 来改变JFrame的背景颜色; Frame中则可以直接使用: Frame.setBackground(new Color);

 

JFrame透明度设置

  java.awt.EventQueue.invokeLater(new Runnable() {    public void run() {     AAA a = new AAA();     a.setVisible(true); //    com.sun.awt.AWTUtilities.setWindowShape(a, new Ellipse2D.Double(0, 0, a.getWidth(), a.getHeight()));     com.sun.awt.AWTUtilities.setWindowOpacity(a, 0.80f);    }   });

 

a为JFrame 0.80F为透明度系数

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、付费专栏及课程。

余额充值