如何在JPanel上设置边框?

19

我的项目由两个类组成,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
请澄清一下,您所说的“根据我显示面板的框架设置填充”,是什么意思?您是说在使用此JPanel时没有空边框吗? - Hovercraft Full Of Eels
我像代码中所示设置了一个空边框。但是当我将这个jpanel添加到我的框架时,没有显示边框。 - DarkLeafyGreen
这里是我设置面板的地方 http://pastebin.com/yLHsNFym - DarkLeafyGreen
1
@ArtWorkAD:所以你是在构造函数中和使用JPanel时都添加了一个空边框?这很令人困惑,我认为弄清楚问题的最好方法是创建并粘贴一个小的可编译文件来展示你的问题,即SSCCE。请查看此链接。 - Hovercraft Full Of Eels
不要使用frame.setSize(400, 400),应该使用pack()。 - MeBigFatGuy
显示剩余3条评论
6个回答

27
JPanel jPanel = new JPanel();

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

这里不仅可以给jPanel添加边框,还可以给任何Jcomponent添加边框。


18

可能问题出在你的两个构造函数重载上,一个设置了边框,而另一个没有:

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

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

}

如果你使用第二个构造函数创建一个 GoBoard 对象并传递一个整数参数,那么空边框将不会被创建。为了解决这个问题,请考虑更改代码使得两个构造函数都设置边框:

// 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....

4

一个空的边框是透明的。当你设置边框时,需要指定一个线条边框或其他可见边框才能看到它。

基于问题的编辑:

画作没有尊重边框。将这行代码添加到您的测试中,您将看到边框:

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

@ArtWorkAD,你确定你调用了你的第一个构造函数吗?提供一个SSCCE会更好。 - jzd
@ArtWorkAD,请在您的问题中添加额外的代码,而不是将代码链接粘贴在评论中。谢谢。 - jzd

2

Swing不知道GoBoard的首选、最小和最大尺寸应该是多少,因为您没有在其中放置任何组件来进行基于计算,因此它选择了(可能错误的)默认值。由于您在此处进行自定义绘图,因此应实现这些方法。

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

或者相反,调用这些方法的设置器。

1

BorderLayout(int Gap, int Gap)GridLayout(int Gap, int Gap, int Gap, int Gap)

为什么在 paintComponent( ...) 中绘制 Border()?

    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
为了获得固定的填充,我将设置布局为java.awt.GridBagLayout并使用一个单元格。然后,您可以为每个单元格设置填充。接下来,您可以将内部的JPanel插入到该单元格中,并(如果需要)将适当的JPanel方法委托给内部的JPanel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接