java绘画图片后组件被覆盖_【Swing】JPanel重写paint()后按钮被遮挡,点击按钮键盘监听失效...
时间: 2024-02-19 16:04:01 浏览: 40
这是因为在JPanel重写paint()方法后,会覆盖掉该组件上原有的组件(如按钮)的绘制,导致按钮被遮挡。
解决方法是在重写paint()方法时,先调用super.paint()方法,保证原有组件的绘制不被覆盖。
例如:
```
@Override
public void paint(Graphics g) {
super.paint(g); // 先调用父类的paint方法,保证原有组件的绘制
// 进行自定义的绘制操作
// ...
}
```
另外,该问题可能还会导致键盘监听失效,因为组件被覆盖后,可能会影响焦点的获取。解决方法是在组件上添加一个焦点监听器,确保组件能正常获取焦点。
例如:
```
JPanel panel = new JPanel();
panel.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
// 组件获取焦点时,重新添加键盘监听器
panel.addKeyListener(keyListener);
}
@Override
public void focusLost(FocusEvent e) {
// 组件失去焦点时,移除键盘监听器
panel.removeKeyListener(keyListener);
}
});
```
相关问题
用java.swing设计一个单选按钮,点击后可以跳出两个文本输入框,并对其进行监视
好的,以下是一个简单的实现:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class RadioButtonDemo extends JFrame implements ActionListener {
private JRadioButton radio;
private JTextField textField1, textField2;
public RadioButtonDemo() {
setTitle("单选按钮监听");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建单选按钮
radio = new JRadioButton("点击我");
// 创建两个文本框
textField1 = new JTextField();
textField2 = new JTextField();
// 设置单选按钮的监听器
radio.addActionListener(this);
// 将组件添加到窗口中
JPanel panel = new JPanel(new GridLayout(3, 2));
panel.add(new JLabel("选项:"));
panel.add(radio);
panel.add(new JLabel("文本框1:"));
panel.add(textField1);
panel.add(new JLabel("文本框2:"));
panel.add(textField2);
panel.setVisible(false);
add(panel);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// 如果单选按钮被选中,显示两个文本框
if (radio.isSelected()) {
JPanel panel = (JPanel) getContentPane().getComponent(0);
panel.setVisible(true);
}
// 监听两个文本框的内容变化
textField1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("文本框1的内容为:" + textField1.getText());
}
});
textField2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("文本框2的内容为:" + textField2.getText());
}
});
}
public static void main(String[] args) {
new RadioButtonDemo();
}
}
```
运行程序后,会弹出一个窗口,其中包含一个单选按钮和两个文本框。点击单选按钮后,文本框会显示出来。在文本框中输入内容后,控制台会输出相应的内容。注意,这里只是一个简单的示例,实际应用中可能需要根据具体需求进行修改。
java.swing 如何覆盖上一个JPanel
要覆盖上一个 JPanel,可以使用 setContentPane() 方法。该方法用于设置 JFrame 中的主要内容区域,可以将一个 JPanel 对象作为参数传递给该方法,从而覆盖掉原来的内容。
例如,假设我们已经创建了一个 JFrame 对象 frame,现在需要覆盖掉其中的一个 JPanel,可以使用以下代码:
```
JPanel newPanel = new JPanel();
// 设置 newPanel 的属性和内容
frame.setContentPane(newPanel);
frame.validate();
frame.repaint();
```
其中,newPanel 是一个新的 JPanel 对象,可以在其中添加需要显示的内容。调用 setContentPane() 方法将该对象设置为 JFrame 的主要内容区域。最后,调用 validate() 和 repaint() 方法可以使界面重新绘制,以显示新的内容。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)