这是我的块类:
public class Block extends JComponent {
public int width, height;
public Color colour;
public Block( int width, int height, Color colour) {
super();
setSize(new Dimension(width, height));
setPreferredSize(new Dimension(width, height));
setBackground(colour);
this.width = width;
this.height = height;
this.colour = colour;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colour);
g.fillRect(0, 0, width, height);
}
}
我的球类:
public class Ball extends JComponent {
public int width, height;
public Color colour;
public Ball(int width, int height, Color colour) {
super();
setSize(new Dimension(width, height));
setPreferredSize(new Dimension(width, height));
setBackground(colour);
this.width = width;
this.height = height;
this.colour = colour;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colour);
g.fillOval(0, 0, width, height);
}
}
这是我的主要课程:
public class Main extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setContentPane(new Main());
frame.setSize(new Dimension(1000, 1000));
frame.setPreferredSize(new Dimension(1000, 1000));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Main() {
JComboBox<String> shapes = new JComboBox(new String[]{"Square", "Oval"});
JSpinner width = new JSpinner();
SpinnerNumberModel widthModel = new SpinnerNumberModel();
widthModel.setMinimum(1);
widthModel.setMaximum(200);
width.setModel(widthModel);
JSpinner height = new JSpinner();
SpinnerNumberModel heightModel = new SpinnerNumberModel();
heightModel.setMinimum(1);
heightModel.setMaximum(200);
height.setModel(heightModel);
JButton submit = new JButton("Add Shape");
submit.addActionListener((ActionEvent e) -> {
if (shapes.getSelectedItem().equals("Square")) {
add(new Block((Integer)widthModel.getValue(), (Integer)heightModel.getValue(), Color.BLUE));
} else {
add(new Ball((Integer)widthModel.getValue(), (Integer)heightModel.getValue(), Color.BLUE));
}
});
add(shapes);
add(width);
add(height);
add(submit);
}
}
当您点击&#34;提交&#34;按钮,它应添加正方形或椭圆形(取决于您的选择),以及您在微调器中指定的高度和宽度。但是,它没有任何东西。我打印出宽度和高度,它们是有效的,所以没有问题。此外,我尝试自己添加自定义组件,并且工作正常。
答案 0 :(得分:1)
你忘记了两件重要的事情:
getPreferredSize()
和Brick
Ball
revalidate()
和repaint()
这是固定代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
public class Main extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setContentPane(new Main());
frame.setSize(new Dimension(1000, 1000));
frame.setPreferredSize(new Dimension(1000, 1000));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Main() {
JComboBox<String> shapes = new JComboBox(new String[] {"Square", "Oval"});
JSpinner width = new JSpinner();
SpinnerNumberModel widthModel = new SpinnerNumberModel();
widthModel.setMinimum(1);
widthModel.setMaximum(200);
width.setModel(widthModel);
JSpinner height = new JSpinner();
SpinnerNumberModel heightModel = new SpinnerNumberModel();
heightModel.setMinimum(1);
heightModel.setMaximum(200);
height.setModel(heightModel);
JButton submit = new JButton("Add Shape");
submit.addActionListener(e -> {
if (shapes.getSelectedItem().equals("Square")) {
add(new Block((Integer) widthModel.getValue(), (Integer) heightModel.getValue(), Color.BLUE));
} else {
add(new Ball((Integer) widthModel.getValue(), (Integer) heightModel.getValue(), Color.BLUE));
}
revalidate();
repaint();
});
add(shapes);
add(width);
add(height);
add(submit);
}
public static class Block extends JComponent {
public int width, height;
private final Dimension size;
public Color colour;
public Block(int width, int height, Color colour) {
super();
setSize(new Dimension(width, height));
setPreferredSize(new Dimension(width, height));
setBackground(colour);
this.width = width;
this.height = height;
this.colour = colour;
this.size = new Dimension(width, height);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colour);
g.fillRect(0, 0, width, height);
}
@Override
public Dimension getPreferredSize() {
return size;
}
}
public class Ball extends JComponent {
public int width, height;
private final Dimension size;
public Color colour;
public Ball(int width, int height, Color colour) {
super();
setSize(new Dimension(width, height));
setPreferredSize(new Dimension(width, height));
setBackground(colour);
this.width = width;
this.height = height;
this.colour = colour;
this.size = new Dimension(width, height);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colour);
g.fillOval(0, 0, width, height);
}
@Override
public Dimension getPreferredSize() {
return size;
}
}
}
答案 1 :(得分:1)
添加组件后调用repaint()
方法。