그래서 나는 다음 내 주요 JFrame의에 추가되는 JPanel과 (사각형)에 사각형을 그릴 노력하고있어. 사각형은 내 윈도우의 중앙에 있어야하지만, 대신 외부 창의된다.
상황이 나는 시도했다 :
- JFrame의에 JPanel을 추가하고 JPanel의, 아니 변화에 사각형을 추가.
- 설정 JFrames는 레이아웃
null
사각형을 볼 수데도 사라집니다.
관련 코드 :
Main.java
package sudoku_solver;
public class Main
{
public static void main(String[] args)
{
int[][] board = Board.getBoard();
Solver solver = new Solver(board);
Interface gui = new Interface();
gui.createFrame();
gui.drawGrid(board);
solver.solve();
solver.print();
}
}
Interface.java
package sudoku_solver;
import java.awt.*;
import javax.swing.*;
public class Interface
{
private static class Rect extends JPanel
{
private static final long serialVersionUID = 1L;
int x;
int y;
int rectWidth;
int rectHeight;
Color color;
public Rect(int _x, int _y, int _rectWidth, int _rectHeight, Color _color)
{
x = _x;
y = _y;
rectWidth = _rectWidth;
rectHeight = _rectHeight;
color = _color;
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawRect(x, y, rectWidth, rectHeight);
g2d.setColor(color);
}
}
static JFrame frame;
static int windowWidth = 580;
static int windowHeight = 580;
static int cellSize = windowWidth / 9;
public void createFrame()
{
frame = new JFrame("Sudoku");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(windowWidth, windowHeight);
frame.setVisible(true);
}
public void drawGrid(int[][] bo)
{
drawBorder();
}
private static void drawBorder()
{
Rect rect = new Rect(20, 20, windowWidth - 20, windowHeight - 20, Color.black);
frame.add(rect);
}
}
산출:
같은 문제로 다른 사람을 찾는 시도했지만 하나를 찾을 수 없습니다. 감사!
문제는 당신이 프레임의 크기를 제어하려고하는 것입니다. 스윙이 어떻게 작동하는지 그건 아닙니다. 프레임 크기는 제목 표시 줄과 테두리를 포함 기억하십시오. 따라서 상기 프레임에 부가 된 패널의 크기가 프레임 크기와 동일한 수 없을 것이다.
대신 당신은 프레임에 추가 된 구성 요소의 크기를 제어 할 수 있습니다. 그런 다음 프레임이 제대로 이러한 구성 요소에 따라 크기가됩니다.
static int windowWidth = 580;
static int cellSize = windowWidth / 9;
당신이 이제까지 구가 580로 동등하게 분할하지 않기 때문에 셀 크기를 동일하게 얻을 것이다 어떻게 왜 당신은 이제까지 (580)의 폭을 선택할 것입니다.
그래서 그 대신 당신은 당신의 셀 크기를 지정해야합니다. 그런 다음 패널에서 당신은 곱하기 9 패널의 추천 사이즈를 얻을 수 있습니다.
Rect rect = new Rect(20, 20, windowWidth - 20, windowHeight - 20, Color.black);
또한, 4 개 개의 다른 장소에서 값 (20)을 하드 코딩하지 않습니다. 다시 말하지만, 당신은 클래스 라인 "borderSize"에 매개 변수가있을 수 있습니다. 그리고 내부적으로이 값을 사용합니다.
당신의 사각형 클래스의 매개 변수 같은 것을 보일 수 있도록 : 공공 사각형 (INT의 cellSize, INT borderSize을, 컬러 _color는) 이제 구현해야하는 getPreferredSize()
구성 요소가 선호하는 크기를 계산할 수 있도록 클래스의 방법을. 뭔가 같은 :
@Override
public Dimension getPreferredSize()
{
int size = (cellSize * 9) + (borderSize * 2);
return new Dimension(size, size);
}
당신이 할 때 이제 모든 그림을 그림 사용자 정의 패널을 완료 상대입니다. 뭔가 같은 :
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int size = (cellSize * 9);
g2d.drawRect(borderSize, borderSize, size, size);
g2d.setColor(color);
}
당신은 당신이 사용하는 것과 클래스의 인스턴스를 만들 때 이렇게 :
public void createFrame()
{
Rect rect = new Rect(50, 20, Color.black);
frame = new JFrame("Sudoku");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(rect);
frame.pack();
//frame.setSize(windowWidth, windowHeight);
frame.setVisible(true);
}