我刚刚开始学习Java的挥杆技巧。我在Swing库中的JSplitPane遇到问题。我制作了一个具有四个类的应用程序Frame(), TablePanel(), TextPanel(), FormPanel()
Frame是扩展JFrame的主要类。下图更清晰地描述了这些类。
现在我的问题是我希望分隔符位于TablePanel
类和TextPanel
类之间。我想知道是否有一种方法可以在TablePanel
中实例化TextPanel
并在Table Panel和TextPanel
之间设置分隔符,例如:
以下只是一个伪代码;
TablePanel() {
TextPanel textPanel = new TextPanel();
setLayout(new BorderLayout());
JSplitPane spliter = new JSplitPane(vertical, textPanel, this);
add(spliter);
}
如果我错了,请。通过提出更好的方法来纠正我的错误。
一个有用的答案将不胜感激。预先感谢!
最佳答案
使用JSplitPane.setDividerLocation(double)
,但请注意Java文档:
将分隔线位置设置为JSplitPane
大小的百分比。
此方法根据setDividerLocation(int)
实现。此方法根据其当前大小立即更改拆分窗格的大小。如果未正确实现拆分窗格并在屏幕上显示,则此方法将无效(新的分隔符位置将变为(当前大小*比例位置)为0)。
因此必须在可见GUI后调用它。
为了在构建GUI的过程中实现这一点,我将使用一次Swing Swing Timer
来将分频器位置的设置延迟大约半秒钟,然后在创建组件结束时启动计时器。
实作
这是作为MCVE的简单实现。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class SplitPaneDivider {
private JComponent ui = null;
SplitPaneDivider() {
initUI();
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
final JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
new ColoredPanel(Color.GREEN),
new ColoredPanel(Color.YELLOW));
ui.add(sp);
ActionListener dividerListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sp.setDividerLocation(.7d);
}
};
Timer timer = new Timer(500, dividerListener);
timer.setRepeats(false);
timer.start();
}
class ColoredPanel extends JPanel {
ColoredPanel(Color color) {
setBackground(color);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 100);
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
SplitPaneDivider o = new SplitPaneDivider();
JFrame f = new JFrame("Split Pane Divider");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}