내 borderlayout 안에 theGrid 배열에서 참조하는 JPanels가 있습니다. 별도의 함수에서 JPanel의 모양을 변경하고자하므로 특정 JPanel을 그려야하는 방식을 변경합니다. 문제는 인스턴트 메시징 (JPanel)의 새로운 버전을 페인트하는 방법을 알지 못한다는 것입니다.BorderLayout 내에서 JPanels를 다시 그리는 방법
다른 질문을 보았습니다. mainPanel 또는 contentPane에서 .revalidate, .validate, .repaint() 등을 사용해 보았습니다. 그렇지 않으면 두 버전 모두에서 생성 된 JPanel의 새 버전을 가져 오지 못합니다. 에.
I 설정 그리드 아래의 생성자에서와 같은 클래스에있는 점을 추가하여 그리드를 업데이트 할 생각입니다 아래 그것은 JFrame의
public class GraphicDisplay extends JFrame {
private static int ROWS = 6;
private static int COLS = 7;
private JPanel[][] theGrid = new JPanel[ROWS][COLS];
private JPanel mainPanel = new JPanel(new GridLayout(ROWS, COLS));
private Container contentPane;
public GraphicDisplay() {
for (int i = 0; i < theGrid.length; i++) { //Initialize theGrid (with blanks)
for (int j = 0; j < theGrid[i].length; j++) {
theGrid[i][j] = new JPanel();
}
}
//add them to the JFrame
contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel boardElements = new JPanel();
boardElements.setLayout(new BoxLayout(boardElements, BoxLayout.Y_AXIS)); //vertical layout for the two parts, theGrid itself and then the
// button which goes underneath,
final int SPACE = 3;
final Color COLORCHOICE = Color.BLACK;
mainPanel.setBorder(BorderFactory.createEmptyBorder(SPACE, SPACE, SPACE, SPACE));
mainPanel.setBackground(COLORCHOICE);
JPanel[][] panels = new JPanel[ROWS][COLS];
for (int i = 0; i < panels.length; i++) {
for (int j = 0; j < panels[i].length; j++) {
panels[i][j] = new JPanel(new GridLayout(1, 1, 1, 1));
panels[i][j].setBackground(COLORCHOICE);
panels[i][j].setBorder(BorderFactory.createEmptyBorder(SPACE, SPACE, SPACE, SPACE));
mainPanel.add(panels[i][j]);
panels[i][j].add(theGrid[i][j]);
}
}
//adding the grid to the vertical layout
boardElements.add(mainPanel);
//adding the button which will go directly under the grid
boardElements.add(new JButton("Button"));
contentPane.add(boardElements, BorderLayout.CENTER);
}
기능의 나머지 부분에 맞는 방법 점 3,3
public void addDotToGrid() {
//theGrid[3][3] reference was added to the panels array which is part of the layout, so I would of thought by changing the value of it here would then change this JPanel on the UI
theGrid[3][3] = new JPanel() {
public void paintComponent(Graphics g) {
//g.setColor(Color.RED);
int y = 0;
int diameter = getWidth() -10;
int x = (getWidth()/2) - (diameter/2);
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
// Assume x, y, and diameter are instance variables.
Ellipse2D.Double circle = new Ellipse2D.Double(x, y, diameter, diameter);
g2d.fill(circle);
}
};
}
GraphicDisplay 객체가 생성되는 다른 클래스
주요 방법
public static void main(String[] args) {
GraphicDisplay display2 = new GraphicDisplay();
display2.setSize(600, 600);
display2.setVisible(true);
display2.addDotToGrid();
}
01,235 (그러나 문제는 어떤 가시적 변화를 보이지 않는) 16,
문제는 그리드가 표시되지만 addDotToGrid()는 아무 것도 변경하지 않고 점은
의 적절한 사이즈 아이를 가지지 않는 JPanel는, 0 × 0 픽셀에 그 경계가있는 경우는 인 세트가됩니다. JPanel 서브 클래스의 getPreferredSize()를 오버라이드 (override) 해, 타원을 적응시키는 크기를 돌려줍니다. – VGR