Как установить границу на jPanel? - PullRequest
17 голосов
/ 19 апреля 2011

Мой проект состоит из двух классов, 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;
        }
    }
}

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

Ответы [ 6 ]

20 голосов
/ 16 июля 2014
JPanel jPanel = new JPanel();

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

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

19 голосов
/ 19 апреля 2011

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

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

edit 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....
4 голосов
/ 19 апреля 2011

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

На основе правки вопроса:

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

    jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    jboard.add(new JButton("Test"));  //Add this line
    frame.add(jboard);
2 голосов
/ 19 апреля 2011

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

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

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

1 голос
/ 19 апреля 2011

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);
0 голосов
/ 19 апреля 2011

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

...