gpt4 book ai didi

java - 在 Java 中使用 JSplitPane 有问题吗?

转载 作者:行者123 更新时间:2023-11-30 08:57:16 26 4
gpt4 key购买 nike

我刚开始用 Java 学习 swing。我在 swing 库中遇到 JSplitPane 问题。我做了一个有四个类的应用程序 Frame(), TablePanel(), TextPanel(), FormPanel() Frame 是扩展 JFrame 的主要类。下图更清楚地描述了这些类。

enter image description here

现在我的问题是我希望拆分器位于 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 文档:

Sets the divider location as a percentage of the JSplitPane's size.

This method is implemented in terms of setDividerLocation(int). This method immediately changes the size of the split pane based on its current size. If the split pane is not correctly realized and on screen, this method will have no effect (new divider location will become (current size * proportionalLocation) which is 0).

所以它必须在 GUI 可见之后调用。

为了在构建 GUI 的过程中实现这一点,我将使用单次 Swing Timer 将分隔线位置的设置延迟大约半秒,然后在创建组件结束时启动计时器。

实现

这是一个作为 MCVE 的简单实现。

enter image description here

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);
}
}

关于java - 在 Java 中使用 JSplitPane 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239724/

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