repaint () стирает все, не обновляя JPanel - PullRequest
0 голосов
/ 15 апреля 2019

пробуя код простой графический интерфейс.Научиться работать с отдельными классами для каждого элемента графического интерфейса.Вот простой код.1-й класс

public class FieldDraw extends JPanel {
    JPanel field;

    public FieldDraw() {
        field = new JPanel();

        field.setBorder(new LineBorder(new Color(0, 0, 0)));

    }

    public void addField(JPanel p) {

        p.add(field, BorderLayout.CENTER);
    }

    public void drawRect(Graphics g, int start) {

        super.paintComponent(g);




        g.drawString("BLAH", 100, 100);
        g.drawRect(start, 200, 200, 200);

    }

    public void clean() {
        // TODO Auto-generated method stub
        field.repaint();

    }

}

2-й

public class Controlls extends JPanel implements ChangeListener {

    JPanel controls;
    JButton btn1;
    JButton btn2;
    JSlider fieldResolution;
    int test;

    public Controlls() {
        controls = new JPanel();

        btn1 = new JButton("weqwe");
        btn1.setAlignmentX(Component.RIGHT_ALIGNMENT);
        btn1.setMaximumSize(new Dimension(Integer.MAX_VALUE, btn1.getMinimumSize().height));


        btn2 = new JButton("weqwefdaf");
        btn2.setAlignmentX(Component.RIGHT_ALIGNMENT);
        btn2.setMaximumSize(new Dimension(Integer.MAX_VALUE, btn2.getMinimumSize().height));


        Component vert5 = Box.createVerticalStrut(5);
        Component vert20 = Box.createVerticalStrut(20);



        fieldResolution = new JSlider(JSlider.HORIZONTAL, FIELD_SIZE_MIN, FIELD_SIZE_MAX, FIELD_SIZE_MAX / 4);
        fieldResolution.setMajorTickSpacing(100);
        fieldResolution.setPaintTicks(true);
        fieldResolution.setAlignmentX(Component.RIGHT_ALIGNMENT);
        fieldResolution.addChangeListener(this);
        Hashtable<Integer, JLabel> resolutionLabel = new Hashtable<Integer, JLabel>();
        resolutionLabel.put(FIELD_SIZE_MIN, new JLabel(String.valueOf(FIELD_SIZE_MIN)));
        resolutionLabel.put(FIELD_SIZE_MAX / 2, new JLabel(String.valueOf(FIELD_SIZE_MAX / 2)));
        resolutionLabel.put(FIELD_SIZE_MAX, new JLabel(String.valueOf(FIELD_SIZE_MAX)));
        fieldResolution.setLabelTable(resolutionLabel);
        fieldResolution.setPaintLabels(true);
        fieldResolution.setMaximumSize(new Dimension(Integer.MAX_VALUE, fieldResolution.getMinimumSize().height));
        //fieldResolution.setma

        controls.setLayout(new BoxLayout(controls, BoxLayout.Y_AXIS));

        controls.add(btn1);
        controls.add(vert5);
        controls.add(btn2);
        controls.add(vert20);
        controls.add(fieldResolution);

    }

    public void addControlls(JPanel p) {

        p.add(controls, BorderLayout.EAST);
    }

    public void stateChanged(ChangeEvent e) {
        // TODO Auto-generated method stub
        System.out.println(fieldResolution.getValue());

    }

}

3-й


public class Gui extends JFrame {

    JPanel guiFrame;
    FieldDraw field;
    Controlls controlls;

    public Gui() {

        guiFrame = new JPanel();

        field = new FieldDraw();

        controlls = new Controlls();
        setTitle("Main window"); // Название окна
        setBounds(0, 0, 300, 300); // Если не выставить
                                    // размер и положение
                                    // то окно будет мелкое и незаметное
        // setUndecorated(true); // убирает рамку окна(крестик, развернуть и тд.

        guiFrame.setBorder(new EmptyBorder(5, 5, 5, 5));
        guiFrame.setLayout(new BorderLayout());
        setContentPane(guiFrame);

        field.addField(guiFrame);
        controlls.addControlls(guiFrame);

        setExtendedState(JFrame.MAXIMIZED_BOTH);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        controlls.fieldResolution.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                // TODO Auto-generated method stub
                // field.field.update(getGraphics());

                field.drawRect(getGraphics(), controlls.fieldResolution.getValue());

                // field.update(getGraphics());
                // repaint();

            }
        });

    }

}

Один класс - пустое поле для рисования чего-либо, второй - несколько элементов управления, а третий - класс Jframe,Я поставил ползунок, и если вы передвинете его, квадрат на поле должен переместиться.и это.Но это оставляет все предыдущие рисунки скриншот

Вот проблема.repaint () не обновляет jpanel.Это просто чистая вечность.Я вижу, когда я двигаюсь, ползунок движется.он просто мигает секунду, а затем стирает все.

1 Ответ

0 голосов
/ 15 апреля 2019

У меня была эта проблема раньше. Попробуйте использовать .pack. Документация по этому поводу не совсем ясна, но я работал на меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...