Как установить границу на jPanel?

Мои проекты состоят из двух классов, GoBoard расширяет JPanel.

GoTest.java:

import javax.swing.*;
import java.awt.Graphics;
import java.io.*;
import java.awt.*;

import javax.swing.border.Border;
import javax.swing.border.LineBorder;

class GoTest{
    private static void initGui(){
        JFrame frame = new JFrame("GoBoard");
        GoBoard jboard = new GoBoard();
        jboard.setLayout(new BorderLayout(10,10));
        jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
        frame.add(jboard);



        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                initGui();
            }
        });
    }
}

GoBoard.java:

import javax.swing.*;
import java.awt.Graphics;
import javax.swing.border.Border;
class GoBoard extends JPanel{
    private int linien;

    public GoBoard(){
        this(9);    
    }

    public GoBoard(int pLinien){
        this.linien = pLinien;
        this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int d = 0;
        int h = 0;
        for(int i = 0; i < this.linien; i++){
            g.drawLine(0,h, getWidth(), h);
            g.drawLine(d,0,d,getHeight());
            h += getHeight()/this.linien;
            d +=getWidth()/this.linien;
        }
    }
}

Я хочу установить границу для заполнения в соответствии с кадром, где я показываю панель. Однако у меня нет границы. Любая идея?

Ответы

Ответ 1

Возможно, проблема заключается в двух перегрузках конструктора, который устанавливает границу, а другой - нет:

public GoBoard(){
    this.linien = 9;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

public GoBoard(int pLinien){
    this.linien = pLinien;

}

Если вы создаете объект GoBoard со вторым конструктором и передаете параметр int, пустая граница не будет создана. Чтобы исправить это, подумайте об этом, чтобы оба конструктора установили границу:

// default constructor
public GoBoard(){
    this(9);  // calls other constructor
}

public GoBoard(int pLinien){
    this.linien = pLinien;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

изменить 1: Добавленная граница больше предназначена для контроля того, как компоненты добавляются в ваш JPanel. Если вы хотите нарисовать свой JPanel, но у вас есть граница вокруг чертежа, подумайте о том, чтобы поместить этот JPanel в другой JPanel, удерживающий JPanel, который имеет границу. Например,

class GoTest {
   private static final int JB_WIDTH = 400;
   private static final int JB_HEIGHT = JB_WIDTH;

   private static void initGui() {
      JFrame frame = new JFrame("GoBoard");
      GoBoard jboard = new GoBoard();
      jboard.setLayout(new BorderLayout(10, 10));

      JPanel holdingPanel = new JPanel(new BorderLayout());
      int eb = 20;
      holdingPanel.setBorder(BorderFactory.createEmptyBorder(0, eb, eb, eb));
      holdingPanel.add(jboard, BorderLayout.CENTER);
      frame.add(holdingPanel, BorderLayout.CENTER);
      jboard.setPreferredSize(new Dimension(JB_WIDTH, JB_HEIGHT));

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      //!! frame.setSize(400, 400);
      frame.pack();
      frame.setVisible(true);
   }

// .... etc....

Ответ 2

JPanel jPanel = new JPanel();

jPanel.setBorder(BorderFactory.createLineBorder(Color.black));

Здесь не только jPanel, вы можете добавить границу к любому Jcomponent

Ответ 3

Пустая граница прозрачна. Вам нужно указать границу линии или другую видимую границу, когда вы установите границу для ее просмотра.

На основе Изменить на вопрос:

Картина не соблюдает границу. Добавьте эту строку кода в свой тест, и вы увидите границу:

    jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    jboard.add(new JButton("Test"));  //Add this line
    frame.add(jboard);

Ответ 4

Swing не знает, какие предпочтительные, минимальные и максимальные размеры GoBoard должны быть такими, как у вас нет компонентов внутри него, чтобы он мог рассчитывать на основе, поэтому он выбирает (возможно, неверный) вариант по умолчанию. Поскольку вы делаете пользовательский рисунок здесь, вы должны реализовать эти методы.

Dimension getPreferredSize()
Dimension getMinumumSize()
Dimension getMaximumSize()

или наоборот, вызовите сеттеры для этих методов.

Ответ 5

BorderLayout(int Gap, int Gap) или GridLayout(int Gap, int Gap, int Gap, int Gap)

зачем рисовать Border() внутри paintComponent (...)

    Border line, raisedbevel, loweredbevel, title, empty;
    line = BorderFactory.createLineBorder(Color.black);
    raisedbevel = BorderFactory.createRaisedBevelBorder();
    loweredbevel = BorderFactory.createLoweredBevelBorder();
    title = BorderFactory.createTitledBorder("");
    empty = BorderFactory.createEmptyBorder(4, 4, 4, 4);
    Border compound = BorderFactory.createCompoundBorder(empty, xxx);
    Color crl = (Color.blue);
    Border compound1 = BorderFactory.createCompoundBorder(empty, xxx);

Ответ 6

Чтобы получить фиксированное дополнение, я установлю макет на java.awt.GridBagLayout на одну ячейку. Затем вы можете установить дополнение для каждой ячейки. Затем вы можете вставить внутреннюю JPanel в эту ячейку и (если вам нужно) делегировать правильные методы JPanel для внутреннего JPanel.