Java GUI组件(新手)
谢谢你的帮助。现在所有的对象都显示出来了 但我遇到了一个新问题。我试着用一个For循环来画10个相同盒子的副本,中间有一点空间,这样它们就不会堆叠在同一个位置 但由于某些原因,它们一直被画在彼此的顶部和中间,而不是从x=20开始Java GUI组件(新手),java,user-interface,Java,User Interface,谢谢你的帮助。现在所有的对象都显示出来了 但我遇到了一个新问题。我试着用一个For循环来画10个相同盒子的副本,中间有一点空间,这样它们就不会堆叠在同一个位置 但由于某些原因,它们一直被画在彼此的顶部和中间,而不是从x=20开始 import java.awt.*; import javax.swing.*; public class CarWashPanel extends JPanel { public int i; public int x = 20; @Ov
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);
}
}
如果不需要动态添加内容,最好在添加所有组件后调用
setVisible(true)
但是,如果要在框架可见后添加内容,可以这样做,然后调用框架的revalidate()
方法使其重新绘制
其次,我建议您在添加任何组件之前设置布局。在添加组件之前,您正在调用
setVisible
。在CarWashPanel
上添加组件,在JFrame
上添加CarWashPanel
,然后调用setVisible
。另外,删除这一行:setLayout(newflowlayout())
-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);
}
}
}
其他旁注:
不要为JFrame
调用setSize
,调用pack
。而是覆盖JPanel
的getPreferredSize
,并返回一些维度
避免使用JFrame
扩展类,除非您想定义新方法或覆盖现有方法
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);
}
}
}