Java Swing中JButton背景颜色修改后不显示的问题排查
问题分析
你遇到的核心问题是:点击按钮后,你重新调用setCellPanel创建了新的zellPanel和按钮数组,但这个新的zellPanel并没有添加到窗口的内容面板中。界面上显示的仍然是构造函数里最初添加的旧zellPanel,所以你修改的是新创建的按钮颜色,但这些按钮根本没在界面上显示,自然看不到变化。打印语句能输出颜色变化,是因为新按钮的颜色确实被修改了,只是它们不在界面上。
解决方案
在actionPerformed方法中,调用setCellPanel之后,需要先移除内容面板里的旧zellPanel,再将新创建的zellPanel添加回去,最后调用revalidate()和repaint()更新界面。
修改后的完整代码
import java.awt.event.*; import java.awt.*; import javax.swing.*; public class ButtonColor extends JFrame implements ActionListener { public int Lifecols, Liferows; private JPanel zellPanel, FertigPanel; private JButton ChosenB; public JButton[][] zellen; ButtonColor() { this.setLocationByPlatform(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); setCellPanel(10, 10); FertigPanel = new JPanel(); ChosenB = new JButton("Auswahl bestätigen"); ChosenB.setFont(new Font("Serif", Font.BOLD, 20)); ChosenB.setPreferredSize(new Dimension(600, 50)); ChosenB.addActionListener(this); FertigPanel.add(ChosenB); getContentPane().add(zellPanel); add(Box.createRigidArea(new Dimension(0, 20))); getContentPane().add(FertigPanel); add(Box.createRigidArea(new Dimension(0, 10))); pack(); setVisible(true); } public void setCellPanel(int Lifecols, int Liferows) { zellPanel = new JPanel(); zellPanel.setLayout(new GridLayout(Liferows, Lifecols)); zellPanel.setPreferredSize(new Dimension(1100, 1100)); zellen = new JButton[Liferows][Lifecols]; for (int rowIndex = 0; rowIndex < Liferows; rowIndex++) { for (int colIndex = 0; colIndex < Lifecols; colIndex++) { zellen[rowIndex][colIndex] = new JButton(); zellen[rowIndex][colIndex].setBackground(Color.WHITE); zellPanel.add(zellen[rowIndex][colIndex]); } } } public void SetBlinker1() { System.out.println(zellen[3][3].getBackground()); zellen[3][3].setBackground(Color.BLACK); System.out.println(zellen[3][3].getBackground()); zellen[3][4].setBackground(Color.BLACK); zellen[3][5].setBackground(Color.BLACK); } public void actionPerformed(ActionEvent e) { if (e.getSource() == ChosenB) { // 移除旧的zellPanel getContentPane().remove(zellPanel); setCellPanel(10, 10); // 将新的zellPanel添加到内容面板的最前面(对应原来的位置) getContentPane().add(zellPanel, 0); SetBlinker1(); // 重新验证布局并刷新界面 revalidate(); repaint(); pack(); return; } } public static void main(String[] args) { new ButtonColor(); } }
补充说明
- 移除旧组件后添加新组件时,使用
add(zellPanel, 0)可以保证新的zellPanel放在原来的位置,避免布局错乱。 pack()可以保留,用来重新调整窗口大小以适应新的组件(不过这里组件大小没变,也可以去掉)。SetBlinker1里的repaint()等调用可以去掉,因为最后在actionPerformed里已经调用了revalidate()和repaint(),足够刷新整个界面。
内容的提问来源于stack exchange,提问作者PHS
相关产品推荐
相关产品推荐

