Я пытаюсь создать приложение для решения кубика Рубика. Я использую 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 своего главного меню, чтобы посмотреть, что оно делает, пока. Ключевые слушатели работают, и они обновляют цвет, проблема в том, когда мне нужно визуализировать его экран. Главное меню