gpt4 book ai didi

java - 重绘时文本字段变形

转载 作者:行者123 更新时间:2023-12-02 04:00:43 24 4
gpt4 key购买 nike

我有一个非常简单的 JFrame(它仅包含一个文本字段和我绘制的很多内容),但每当调用 repaint() 时,文本字段都会发生变化。我很确定它是 repaint(),因为即使我将帧从一个监视器拖动到下一个监视器以及每当我在代码中调用它时也会发生这种情况。

当我运行程序时,一切正常:

但是,每当调用 repaint() 时,就会发生这种情况:

如果我开始在字段中输入内容,其余部分会立即弹出并正常工作。最终,我的最终目标是将框架的大部分重置为在paintComponent()中绘制的内容,同时仍然使文本字段可见。

我对图形和绘画比较陌生,非常感谢任何帮助!

编辑

在创建 SSCCE 时,我发现文本字段的问题是由 PaintComponent 方法中的 Graphics2D 方法旋转引起的。我不知道为什么会发生这种情况,但我可以解决它并认为问题已解决。

现在,我遇到了一个新问题:我的paintComponent 方法被调用了太多次。下面是这个问题的 SSCCE,我希望事情发生的顺序是:

  1. 调用paintComponent()
  2. (按下按钮时)调用 repaint()
  3. (按下按钮时,但在重绘之后)调用paintStuff()

这一切都发生了,但是后来以某种方式调用了paintComponent,删除了由paintStuff()绘制的所有内容。

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class tester extends JFrame {

private JPanel contentPane;
private JButton button;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
tester frame = new tester();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public tester() {
setBounds(100, 100, 450, 300);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

contentPane = new JPanel(){
public void paintComponent(Graphics g1) {
System.out.println("draw rectangle - should be first");
super.paintComponent(g1);

g1.drawRect(50,50,50,50);
}
};
contentPane.setLayout(null);
setContentPane(contentPane);

button = new JButton("Click me!");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("repaint - should be second");
repaint();

paintStuff(contentPane.getGraphics());
}
});
button.setBounds(10, 11, 95, 20);
contentPane.add(button);
}

public void paintStuff(Graphics g){
System.out.println("draw circle - should be last");
g.drawOval(100,100,10,10);
}

}

最佳答案

paintStuff(contentPane.getGraphics());

不,不要使用 getGraphics() 方法进行绘画。要重新绘制组件,您只需使用:

contentPane.repaint();

然后将drawOval(...)语句移至paintComponent()方法。

如果您想有条件地绘制椭圆形,那么您需要为您的自定义绘画创建一个 boolean 属性。那么代码将类似于:

super.paintComponent(g1);

g1.drawRect(50,50,50,50);

if (drawOval)
g1.drawOval(100,100,10,10);

然后在您的类中您将创建一个如下方法:

public void setDrawOval(Boolean drawOval)
{
this.drawOval = drawOval;
repaint();
}

所以在 ActionListener 中你只需使用:

contentPane.setDrawOval(true);

关于java - 重绘时文本字段变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com