JComponent.repaint () не отвечает - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать приложение для решения кубика Рубика. Я использую Eclipse IDE с Java 8. До сих пор я столкнулся с проблемой: я пытаюсь нарисовать свою первоначальную конфигурацию куба (только переднюю грань) , уже). После этого я хочу изменить цвет квадрата, просто чтобы увидеть, как он работает. Хорошая часть: это рендеринг. Проблема в том, что он обновляет цвет, но не перерисовывает () в JFrame. Ниже я прикрепил свой код. Я впервые играю с элементами управления рендеринга, и я не знаю, как правильно его использовать. Конструктор главного меню: (JFrame, в котором я хочу визуализировать куб)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1002, 593);
        contentPane = new JPanel();

        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton solveButton = new JButton("Solve");
        solveButton.setBounds(46, 59, 270, 33);
        panel.add(solveButton);

        JButton btnChangeConfiguration = new JButton("Change Configuration");
        btnChangeConfiguration.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                ChangeConfigMenu configMenuPanel=new ChangeConfigMenu();
                configMenuPanel.setVisible(true);
            }
        });
        btnChangeConfiguration.setBounds(46, 105, 270, 33);
        panel.add(btnChangeConfiguration);

        cubeRenderArea.setBounds(12, 13, 551, 520);
        contentPane.add(cubeRenderArea);
        cubeRenderArea.setLayout(null);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_R) {
                    System.out.println("Refreshing...");
                    cubeRenderArea.repaint();
                    cubeRenderArea.ListCubies();
                }
                if(e.getKeyCode()== KeyEvent.VK_C) {
                    cubeRenderArea.setCubieColor(2, 2, Color.RED);
                }
            }
        });

Класс RectDraw: (используется для управления JPanel, где должен появляться куб )

    public static final int PREFERRED_WIDTH=100;
    public static final int PREFERRED_HEIGHT=100;
    public final int cubieWidth=100;
    public final int offset=50;

    private RubikCube rubikCube=new RubikCube();


    public void setCubieColor(int cubieRowIndex,int cubieColumnIndex,Color preferredColor) {
        rubikCube.getCubie(cubieRowIndex-1,cubieColumnIndex-1).setColor(preferredColor);
        //repaint();
    }
    public RectDraw() {
        super();
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        rubikCube=new RubikCube();
        //Front Face
        g.setColor(rubikCube.getCubie(0).getColor());
        g.drawRect(32+offset, 32+offset, 100, 100);
        g.fillRect(32+offset, 32+offset, 100, 100);

        g.setColor(rubikCube.getCubie(1).getColor());
        g.drawRect(32+cubieWidth+10+offset, 32+offset, 100, 100);
        g.fillRect(32+cubieWidth+10+offset, 32+offset, cubieWidth, cubieWidth);

        g.setColor(rubikCube.getCubie(2).getColor());
        g.drawRect(32+2*cubieWidth+20+offset, 32+offset, cubieWidth, cubieWidth);
        g.fillRect(32+2*cubieWidth+20+offset, 32+offset, cubieWidth, cubieWidth);

        g.setColor(rubikCube.getCubie(3).getColor());
        g.drawRect(32+offset, 32+offset+cubieWidth+10, 100, 100);
        g.fillRect(32+offset, 32+offset+cubieWidth+10, 100, 100);
        //I'm doing this 5 more times with different coordinates.
    }
}

Класс RubikCube (Используется для установки и управления всеми кубами моего Кубика Рубика)

    private ArrayList<Cubie> cubies;

    public RubikCube() {
        InitializeCubies();
    }
    private void InitializeCubies(){
        cubies=new ArrayList<Cubie>(27);
        for(int i=0;i<27;i++) {
            cubies.add(new Cubie(i/3,i%3,i,Color.BLACK));
        }
    }
    public Cubie getCubie(int index) {
        return cubies.get(index);
    }
    public Cubie getCubie(int rowIndex,int columnIndex) {
        for(Cubie cubie: cubies) {
            if(cubie.getRowIndex()==rowIndex && cubie.getColumnIndex()==columnIndex) {
                return cubie;
            }
        }
        return null;
    }
    public void setCubieColor(int rowIndex,int columnIndex,Color newColor) {
        cubies.get((rowIndex-1)*3+columnIndex).setColor(newColor);
    }
    public void setCubieColor(int serialIndex,Color newColor) {
        cubies.get(serialIndex).setColor(newColor);
    }

Cub ie Класс:


import java.awt.Color;

public class Cubie {
    private int rowIndex;
    private int columnIndex;
    private int serialIndex;
    private Color color;

    public Cubie() {
        rowIndex=0;
        columnIndex=0;
        serialIndex=0;
        color=Color.BLACK;
    }
    public Cubie(int newIndexRow,int newColumnIndex,int serialIndex,Color newColor) {
        this.rowIndex=newIndexRow;
        this.columnIndex=newColumnIndex;
        this.serialIndex=serialIndex;
        this.color=newColor;
    }
    public int getRowIndex() {
        return rowIndex;
    }
    public void setRowIndex(int rowIndex) {
        this.rowIndex = rowIndex;
    }
    public int getColumnIndex() {
        return columnIndex;
    }
    public void setColumnIndex(int columnIndex) {
        this.columnIndex = columnIndex;
    }
    public int getSerialIndex() {
        return serialIndex;
    }
    public void setSerialIndex(int serialIndex) {
        this.serialIndex = serialIndex;
    }
    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
    public String toString() {
        return "Cubie[MatrixPos("+rowIndex+","+columnIndex+"),Color="+color+"];";
    }
}

По сути, я хочу отрисовать лицо детеныша ie на JPanel. Затем каждый раз, когда я нажимаю клавишу 'r' / 'R', я хочу обновить sh (перекрасить) куб JPanel и когда я нажимаю 'c' / 'C', куб ie в центре квадрата должен изменить его значение.

Надеюсь, я написал достаточно детали, чтобы не запутать вас :). Если вы можете мне помочь, я был бы благодарен. введите описание изображения здесь Я загружаю ss своего главного меню, чтобы посмотреть, что оно делает, пока. Ключевые слушатели работают, и они обновляют цвет, проблема в том, когда мне нужно визуализировать его экран. Главное меню

...