gpt4 book ai didi

java - 无法在 BorderLayout 中垂直对齐水平 JSeparator

转载 作者:行者123 更新时间:2023-11-29 05:21:17 25 4
gpt4 key购买 nike

我使用 BorderLayout 放置了两个不同的 JButton,一个在左边(西),一个在右边(东),中间有一个水平的 JSeparator。我想要做的是将分隔符 y 对齐到中心,而不是像现在这样对齐到顶部。我已经尝试在分隔符上使用以下方法

setAlignmentY(CENTER_ALIGNMENT);

但是完全没有效果。我错过了什么?如果不可能,是否有任何其他方法可以在不使用外部库的情况下做到这一点?

这是我得到的:

Image of the problem

这就是我想要实现的目标:

Image of the solution

这是我正在使用的示例代码(为清楚起见添加了顶部和底部的 JPanel):

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

public class SeparatorTest extends JFrame{

JButton btn1 = new JButton("button1");
JSeparator sep = new JSeparator(SwingConstants.HORIZONTAL);
JButton btn2 = new JButton("button2");

public SeparatorTest() {
getContentPane().add(BorderLayout.NORTH, new JPanel());
getContentPane().add(BorderLayout.WEST, btn1);
getContentPane().add(BorderLayout.CENTER, sep);
getContentPane().add(BorderLayout.EAST, btn2);
getContentPane().add(BorderLayout.SOUTH, new JPanel());

setSize(300, 85);
}

public static void main(String[] args){
new SeparatorTest().setVisible(true);
}
}

编辑 1:我不介意布局,只要它看起来一样,我在这里使用 BorderLayout 因为它很简单。

最佳答案

这将与 JSeparator UI 委托(delegate)如何决定如何绘制组件有关,根据您的测试,组件似乎总是希望从 y 开始绘制分隔符 0 的位置。

相反,您可能需要将 JSeparator 包装在另一个面板中,该面板可以使用满足您需要的不同布局管理器,例如 GridBagLayout(当然您可以只需使用 GridBagLayout 开始,但我的目标是尽可能减少变化 ;))

buttons

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SeparatorTest extends JFrame {

JButton btn1 = new JButton("button1");
JSeparator sep = new JSeparator(SwingConstants.HORIZONTAL);
JButton btn2 = new JButton("button2");

public SeparatorTest() {

JPanel pane = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
pane.add(sep, gbc);

getContentPane().add(BorderLayout.NORTH, new JPanel());
getContentPane().add(BorderLayout.WEST, btn1);
getContentPane().add(BorderLayout.CENTER, pane);
getContentPane().add(BorderLayout.EAST, btn2);
getContentPane().add(BorderLayout.SOUTH, new JPanel());

setSize(300, 85);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

SeparatorTest frame = new SeparatorTest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}

关于java - 无法在 BorderLayout 中垂直对齐水平 JSeparator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24601831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com