4

EtchedBorderを追加したいJPanelがあります。左側の境界線のみに下げられます。MatteBordersでこれが可能であることは知っていますが、EtchedBorderでこれを行う方法があるかどうか疑問に思いました。

4

4 に答える 4

5
  • EtchedBorder.Loweredの代わりに JSeparator を使用し、

  • JSeparator はデフォルトではラインのみですが、面白いボーダーを作成できます

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;

public class NestedLayout {

    private JFrame frame = new JFrame();
    private JPanel leftPanel = new JPanel();

    public NestedLayout() {
        leftPanel.setLayout(new BorderLayout());
        leftPanel.setBorder(BorderFactory.createEmptyBorder(
                10, //top
                10, //left
                10, //bottom
                10));   //right
        leftPanel.add(new JSeparator(JSeparator.VERTICAL), BorderLayout.CENTER);
        leftPanel.setPreferredSize(new Dimension(40, 40));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(leftPanel, BorderLayout.WEST);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NestedLayout();
            }
        });
    }
}
于 2012-06-07T19:10:19.070 に答える
4

2 つのパネルを結合し、それぞれに「反対側」のマット ボーダーを追加して、エッチング効果を再現できます。

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

public class MainFrame extends JFrame {

    public MainFrame() {
        setLayout(new BorderLayout());

        JPanel left = new JPanel();
        left.setPreferredSize(new Dimension(200, 400));
        left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY));
        add(left, BorderLayout.WEST);

        JPanel center = new JPanel();
        center.setPreferredSize(new Dimension(200, 400));
        center.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.WHITE));
        add(center, BorderLayout.CENTER);

        setVisible(true);
        pack();
    }

    public static void main(String[] args) {
        new MainFrame();
    }
}

ここに画像の説明を入力

于 2012-06-07T20:10:45.017 に答える
2

EtchedBorderまたはAbstractBorderをサブクラス化することにより、独自のボーダークラスを簡単に作成できます。

このコードは、あなたが要求したことを正確に実行します。片側だけに描かれたEtchedBorderです。しかし、それはよく見えません。EtchedBorderは、両側に2本の線(1本は暗い、1本は明るい)を描画するだけです。線が角で出会う方法から3次元の外観を取得します。完全なボックスが描画されていないと、3次元には見えません。

setBorder(new EtchedBorder() {
  public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    g.setColor(getShadowColor(c));
    g.drawLine(x, y + height - 2, x, y);

    g.setColor(getHighlightColor(c));
    g.drawLine(x+1, y + height - 3, x+1, y + 1);
  }
});
于 2012-06-08T01:13:59.510 に答える