感谢您的帮助。这些对象现在都在显示。
但我遇到了一个新问题。我试图使用For循环绘制同一个盒子的10个副本,中间有一点空间,所以它们不只是堆叠在同一个位置。
但由于某些原因,他们不断在彼此之上和中间画画,而不是从x = 20开始......
import java.awt.*;
import javax.swing.*;
public class CarWashPanel extends JPanel {
public int i;
public int x = 20;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
for (i=0; i < 10; i++){
g.fillRoundRect(x, 10, 50, 100, 55, 25);
x = x + 10;
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 150);
}
}
//
我正在尝试在我的CarWashPanel类中添加图形,以便添加到我的GUI中。我已经阅读了一些教程和其他问题,但我无法弄清楚我做错了什么。
我添加到GUI的按钮和标签显示得很好但是当我向CarWashPanel添加内容时,它不会显示在GUI中。
我觉得我需要告诉我的GUI添加CarWashPanel中的所有元素,但我不确定如何。
public class Main {
public static void main(String[] args) {
GUI g = new GUI();
}
}
import javax.swing.*;
import java.awt.*;
public class GUI extends JFrame {
private JTextField t1 = new JTextField(2);
private JLabel l1 = new JLabel("enter position");
private JButton b1 = new JButton("new customer");
private JButton b2 = new JButton("wash car");
public GUI() {
setDefaultCloseOperation (
JFrame.EXIT_ON_CLOSE );
add(l1);
add(t1);
add(b1);
add(b2);
setTitle("Carwash");
setSize(500, 200);
setVisible(true);
setLayout(new FlowLayout());
add(new CarWashPanel());
}
}
public class Carwash {
private boolean[] positions = new boolean[10];
private int washing = 10;
public void addCar(int p) {
positions[p] = true;
}
public void removeCar(int p) {
positions[p] = false;
}
public boolean[] getPositions() {
return positions;
}
public int getWashing() {
return washing;
}
}
import java.awt.*;
import javax.swing.*;
public class CarWashPanel extends JPanel {
public CarWashPanel(){
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.fillRoundRect(150, 50, 100, 100, 50, 25);
}
}
答案 0 :(得分:0)
如果您不需要动态添加内容,最好的办法是在之后调用setVisible(true)
,您已添加了所有组件。
但是,如果您希望在框架可见后添加内容,则可以执行此操作,然后调用框架的revalidate()
方法以使其重绘。
其次,我建议您在添加任何组件之前设置布局。
答案 1 :(得分:0)
经常发生问题。在添加组件之前,您正在调用setVisible
。在CarWashPanel
上添加您的组件,在CarWashPanel
上添加JFrame
,然后拨打setVisible
。另外,删除以下行:setLayout(new FlowLayout());
- FlowLayout是JPanel
的默认布局(在您的情况下为CarWashPanel),这样就足够了。
您的代码应如下所示:
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(GUI::new);
}
public static class GUI extends JFrame {
private JTextField t1 = new JTextField(2);
private JLabel l1 = new JLabel("enter position");
private JButton b1 = new JButton("new customer");
private JButton b2 = new JButton("wash car");
CarWashPanel carWashPanel = new CarWashPanel();
public GUI() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
carWashPanel.add(l1);
carWashPanel.add(t1);
carWashPanel.add(b1);
carWashPanel.add(b2);
add(carWashPanel,BorderLayout.CENTER);
setTitle("Carwash");
pack();
setVisible(true);
}
}
public class Carwash {
private boolean[] positions = new boolean[10];
private int washing = 10;
public void addCar(int p) {
positions[p] = true;
}
public void removeCar(int p) {
positions[p] = false;
}
public boolean[] getPositions() {
return positions;
}
public int getWashing() {
return washing;
}
}
public static class CarWashPanel extends JPanel {
public CarWashPanel() {
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.fillRoundRect(150, 50, 100, 100, 50, 25);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 200);
}
}
}
其他旁注:
请勿setSize
致电JFrame
,致电pack
。而是覆盖getPreferredSize
的{{1}}并返回一些维度。
除非您想要定义新方法或覆盖现有方法,否则请避免使用JPanel
扩展您的类。