带滑块的 JPanel 不显示图形
JPanel with JSlider not displaing the Graphics
我只有一个白色背景的 JPanel 和底部的 JSlider,没有显示正方形,我想我在 JPanel 上犯了一些错误 class 但我想不通.就在我用 g.fillOval 做了另一个项目并且它工作正常之前,我检查了一下,每一行代码看起来都一样,我真的很困惑。
public class Main00 {
public static void main(String[] args) {
Gui asd=new Gui();
asd.setVisible(true);
asd.setSize(500,400);
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class Gui extends JFrame {
private JSlider slider;
private DrawSquare square;
public Gui() {
super("square modificator");
setDefaultCloseOperation(EXIT_ON_CLOSE);
square = new DrawSquare();
square.setBackground(Color.WHITE);
slider = new JSlider(SwingConstants.HORIZONTAL, 0, 300,
square.getSide());
slider.setMajorTickSpacing(20);
slider.setPaintTicks(true);
add(square);
add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
square.setSide(slider.getValue());
}
});
}
}
import java.awt.*;
import javax.swing.*;
public class DrawSquare extends JPanel {
private int side = 10;
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.setColor(Color.RED);
g.fillRect(20, 20, side, side);
}
public void setSide(int side) {
this.side=(side>=0)?side:0;
repaint();
}
public Dimension getPrefferedSize(){
return new Dimension(200,200);
}
public Dimension getMinimumSize(){
return getPrefferedSize();
}
public int getSide(){
return side;
}
}
您正在覆盖 paintComponents
而不是正确的 paintComponent
。这两种方法的效果截然不同,第二种的效果才是你想要的。
来自API:
- paintComponents API entry: 绘制此容器中的每个组件。
- paintComponent API entry:如果 UI 委托不为空,则调用 UI 委托的绘制方法。我们将 Graphics 对象的副本传递给委托,以保护其余的绘制代码免受不可撤销的更改
同样,您有兴趣通过其委托绘制组件本身,而不是绘制该组件持有的组件。
我只有一个白色背景的 JPanel 和底部的 JSlider,没有显示正方形,我想我在 JPanel 上犯了一些错误 class 但我想不通.就在我用 g.fillOval 做了另一个项目并且它工作正常之前,我检查了一下,每一行代码看起来都一样,我真的很困惑。
public class Main00 {
public static void main(String[] args) {
Gui asd=new Gui();
asd.setVisible(true);
asd.setSize(500,400);
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class Gui extends JFrame {
private JSlider slider;
private DrawSquare square;
public Gui() {
super("square modificator");
setDefaultCloseOperation(EXIT_ON_CLOSE);
square = new DrawSquare();
square.setBackground(Color.WHITE);
slider = new JSlider(SwingConstants.HORIZONTAL, 0, 300,
square.getSide());
slider.setMajorTickSpacing(20);
slider.setPaintTicks(true);
add(square);
add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
square.setSide(slider.getValue());
}
});
}
}
import java.awt.*;
import javax.swing.*;
public class DrawSquare extends JPanel {
private int side = 10;
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.setColor(Color.RED);
g.fillRect(20, 20, side, side);
}
public void setSide(int side) {
this.side=(side>=0)?side:0;
repaint();
}
public Dimension getPrefferedSize(){
return new Dimension(200,200);
}
public Dimension getMinimumSize(){
return getPrefferedSize();
}
public int getSide(){
return side;
}
}
您正在覆盖 paintComponents
而不是正确的 paintComponent
。这两种方法的效果截然不同,第二种的效果才是你想要的。
来自API:
- paintComponents API entry: 绘制此容器中的每个组件。
- paintComponent API entry:如果 UI 委托不为空,则调用 UI 委托的绘制方法。我们将 Graphics 对象的副本传递给委托,以保护其余的绘制代码免受不可撤销的更改
同样,您有兴趣通过其委托绘制组件本身,而不是绘制该组件持有的组件。