EtchedBorderを追加したいJPanelがあります。左側の境界線のみに下げられます。MatteBordersでこれが可能であることは知っていますが、EtchedBorderでこれを行う方法があるかどうか疑問に思いました。
質問する
3809 次
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 に答える