gpt4 book ai didi

java - 当单个 JFrame 中有多个 JPanel 对象时,repaint() 如何工作?

转载 作者:行者123 更新时间:2023-12-01 11:30:44 24 4
gpt4 key购买 nike

我读到,当 JPanel 对象(或扩展 JPanel 的类的任何实例)是 JFrame 的一部分时,每个当 JVM 认为需要刷新 JFrame 时,就会调用 JPanel 实例的 paintComponent() 方法。

但是当我有两个这样的对象(它们是两个不同类的实例)时会发生什么?运行我最后提供的代码,我发现当我最小化、更改大小或按 colourButton 时,都会调用两个 paintComponent() 方法。

但是,当我按下 labelButton 时,情况却不是。它仅调用MyDrawPanel PaintComponent()。为什么会这样?

提前谢谢您!

class GUI {

JFrame frame;
JLabel label;

void go() {
JButton labelButton = new JButton("Click me to change that (<-) text");
labelButton.addActionListener(new LabelListener());
JButton colourButton = new JButton("Click me to change the colour");
colourButton.addActionListener(new ColourListener());

label = new JLabel("Don't change me!");

frame = new JFrame();
frame.setSize(600, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

MyDrawPanel Q = new MyDrawPanel();
DrawPanel P = new DrawPanel();

frame.getContentPane().add(BorderLayout.CENTER, Q);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.getContentPane().add(BorderLayout.SOUTH, colourButton);
frame.getContentPane().add(BorderLayout.NORTH, P);

}

class LabelListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event){
label.setText("You've changed me!");
}
}

class ColourListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event){
MyDrawPanel.red = (int) (Math.random() * 255);
MyDrawPanel.green = (int) (Math.random() * 255);
MyDrawPanel.blue = (int) (Math.random() * 255);
frame.repaint();
}
}
}

class MyDrawPanel extends JPanel {

static int red = (int) (Math.random() * 255);
static int green = (int) (Math.random() * 255);
static int blue = (int) (Math.random() * 255);

@Override
public void paintComponent(Graphics g){
Color randomColour = new Color(red, green, blue);

g.setColor(randomColour);

g.fillOval(70, 70, 75, 75);

System.out.println("Q");
}
}

class DrawPanel extends JPanel {

@Override
public void paintComponent(Graphics g){

System.out.println("P");

}
}

最佳答案

frame.repaint(); 

这告诉框架重新绘制自身及其所有子框架。因此框架上的所有组件都被重新绘制。

label.setText("You've changed me!");

setText() 方法将调用标签上的 revalidate()repaint()repaint() 告诉标签重新绘制自身及其所有子项。

如果任何组件的大小发生更改,revalidate() 将调用布局管理器。在这种情况下,标签看起来会变大。这意味着添加到中心的面板(您的 DrawPanel)将会变小,因此也需要重新绘制。

北/南的组件不受标签尺寸变化的影响,因此不会重新绘制。

因此 Swing 只会重新绘制最小化绘制所需的任何内容。

关于java - 当单个 JFrame 中有多个 JPanel 对象时,repaint() 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418190/

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