java - 为什么我不能将 EmptyBorder 添加到自定义 JComponent?

标签 java swing

我的代码无法将自定义 JComponent 对象的边框设置为 new EmptyBorder(50, 50, 50, 50)。这是它在我的显示器上的样子(如您所见,它显然适用于 JButton 但不适用于自定义 JComponent):

enter image description here

import java.awt.*;

import javax.swing.*;
import javax.swing.border.*;

public class Sandbox
{
    public static void main(String[] args)
    {
        // Instantiate components needed.
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.add(panel);
        WideComponent wc = new WideComponent();
        JButton button = new JButton("Test");

        // Add borders
        EmptyBorder empty1 = new EmptyBorder(50, 50, 50, 50);
        wc.setBorder(empty1);
        EmptyBorder empty2 = new EmptyBorder(50, 50, 50, 50);
        button.setBorder(empty2);

        // Add stuff to panel
        panel.add(wc);
        panel.add(button);

        // Add panel to frame, show frame
        frame.add(panel);
        frame.setVisible(true);
        frame.pack();
    }
}

class WideComponent extends JComponent
{
    final int WIDTH = 500;
    final int HEIGHT = 150; 

    // drawing method
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, WIDTH, HEIGHT);
    }

    // JComponent sizing methods
    public Dimension getPreferredSize()
    {
        return new Dimension(WIDTH, HEIGHT);
    }
    public Dimension getMaximumSize() { return getPreferredSize(); }
    public Dimension getMinimumSize() { return getPreferredSize(); }    
}

最佳答案

您的边框工作正常 - 但只是空边框被涂成蓝色,因为您正在绘制整个组件,而边框是该组件的一部分。例如:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class Sandbox {
   public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      JPanel panel = new JPanel();
      frame.add(panel);
      WideComponent wc = new WideComponent();
      JButton button = new JButton("Test");

      wc.setBorder(createBorder());
      button.setBorder(createBorder());

      panel.add(wc);
      panel.add(button);

      frame.add(panel);
      frame.setVisible(true);
      frame.pack();
   }

   private static Border createBorder() {
      Border innerBorder = BorderFactory.createLineBorder(Color.red);
      int eb = 50;
      Border outerBorder = BorderFactory.createEmptyBorder(eb, eb, eb, eb);
      Border comboBorder = BorderFactory.createCompoundBorder(outerBorder,
            innerBorder);
      return comboBorder;
   }
}

class WideComponent extends JComponent {
   final int WIDTH = 500;
   final int HEIGHT = 150;

   public WideComponent() {
      setOpaque(true);
   }

   // drawing method
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
       g.setColor(Color.BLUE);
       g.fillRect(0, 0, WIDTH, HEIGHT);
   }

   // JComponent sizing methods
   public Dimension getPreferredSize() {
      return new Dimension(WIDTH, HEIGHT);
   }

   public Dimension getMaximumSize() {
      return getPreferredSize();
   }

   public Dimension getMinimumSize() {
      return getPreferredSize();
   }
}

如果您希望 WideComponent 周围有空白边框,请将其嵌套在 JPanel 中,并将边框赋予嵌套的 JPanel。例如,可以通过添加以下内容来更改上面的代码:

  JPanel nestingJPanel = new JPanel();
  nestingJPanel.add(new WideComponent());
  nestingJPanel.setBorder(createBorder());

  panel.add(wc);
  panel.add(button);
  panel.add(nestingJPanel);

关于java - 为什么我不能将 EmptyBorder 添加到自定义 JComponent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875352/

相关文章:

java - 重定向 View 上的空白页

java - 在哪里可以找到java方法的时间复杂度?

java - java中HttpURLConnection意外断开

java - 关于JLabel的基本问题

java - 无法从主类启动另一个窗口

java - 使用 remove() 后 JPanel 不会消失

java - 排序:HashMap 和 Sets 的替代方案?

java - 从 ListView 中隐藏/显示 ImageView

java - 在 Java JLabel 的 HTML 表格单元格中垂直居中文本

java - doOnSuccess 和 doOnEach 之间的区别,以及在哪个用例中我应该使用它们中的每一个