자바의 drawRect () 메소드는 이상한 / 잘못된 크기를 가지고

Mekala.

그래서 나는 다음 내 주요 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);
    }
}

산출:

출력 내가지고있어

같은 문제로 다른 사람을 찾는 시도했지만 하나를 찾을 수 없습니다. 감사!

camickr :

문제는 당신이 프레임의 크기를 제어하려고하는 것입니다. 스윙이 어떻게 작동하는지 그건 아닙니다. 프레임 크기는 제목 표시 줄과 테두리를 포함 기억하십시오. 따라서 상기 프레임에 부가 된 패널의 크기가 프레임 크기와 동일한 수 없을 것이다.

대신 당신은 프레임에 추가 된 구성 요소의 크기를 제어 할 수 있습니다. 그런 다음 프레임이 제대로 이러한 구성 요소에 따라 크기가됩니다.

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);
}

추천

출처http://10.200.1.11:23101/article/api/json?id=393711&siteId=1