Java GUI paintcomponent(新手)

时间:2014-03-20 15:36:49

标签: 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;

    @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);
           }

            }

2 个答案:

答案 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扩展您的类。